home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / unix / btoa.1 next >
Text File  |  1989-03-15  |  69KB  |  2,041 lines

  1. Path: xanth!ames!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i063:  btoa - encode binary files for ascii transmission v5.2
  5. Message-ID: <12251@swan.ulowell.edu>
  6. Date: 15 Mar 89 20:47:29 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 2030
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: d84sp@efd.lth.se (Stefan Parmark)
  12. Posting-number: Volume 89, Issue 63
  13. Archive-name: unix/btoa.1
  14.  
  15. This is version 5.2 of btoa.
  16.  
  17. Besides expanding binary files by only 25% rather than uuencode's 33%,
  18. it now also has got the ability to REPAIR damaged files, without
  19. having to retransmit the entire file.  It's also faster.
  20.  
  21. It has worked successfully between a Sun-3 and an Amiga 1000.
  22.  
  23. [uuencoded executable included.  With this release, most of the
  24. arguments I have against btoa are answered.  Since it produces smaller
  25. encodings, it might be a candidate to replace uuencode for the
  26. comp.binaries.amiga postings.  If you have any feelings on the matter,
  27. let me know.  ..Bob]
  28.  
  29. #    This is a shell archive.
  30. #    Remove everything above and including the cut line.
  31. #    Then run the rest of the file through sh.
  32. #----cut here-----cut here-----cut here-----cut here----#
  33. #!/bin/sh
  34. # shar:    Shell Archiver
  35. #    Run the following text with /bin/sh to create:
  36. #    README
  37. #    Makefile.amiga_lattice
  38. #    Makefile.sun
  39. #    atob.c
  40. #    btoa.1
  41. #    btoa.c
  42. #    btoa.doc
  43. #    btoa.h
  44. #    btoa.uu
  45. #    chksum.h
  46. #    repair.c
  47. # This archive created: Wed Mar 15 15:37:30 1989
  48. cat << \SHAR_EOF > README
  49.              BTOA version 5.2
  50.             ------------------
  51. Written by Paul Rutter, Joe Orost & Stefan Parmark.
  52.  
  53.  
  54. Btoa was created from atob/btoa which were submitted to Usenet
  55. by Paul E. Rutter. Atob and btoa has now been merged into one
  56. program, now refered to as btoa.
  57.  
  58. Btoa converts 4 binary characters to 5 ascii ones, causing a 25%
  59. expansion. Spaces will not be used, which should make it safe
  60. to send files over Usenet without risking that blanks become
  61. tabs. 
  62.  
  63. Decoding, which previously was done with atob, is now an option
  64. of btoa. See the manual for details.
  65.  
  66. One of the drawbacks with the previous version of btoa was that,
  67. if there was an error in the file, atob only stated so, but gave
  68. no clue to its location. It used a checksum covering the
  69. total file, making it impossible to detect where the error was.
  70. I added a single-byte checksum for each row.
  71.  
  72. Further, the file contained no information about the name of the
  73. output file. Rather, stdout was used. Version 5.0 has the feature
  74. to name the file contents. It can be turned off by reading data
  75. from stdin.
  76.  
  77. A totally new feature is the ability to mend corrupted archives.
  78. This can be done as long as the header and last line are OK.
  79. It detects bad lines, informs the remote computer about this,
  80. which retransmits these lines in a special file, which btoa uses
  81. to repair the archive. See the manual for more details.
  82.  
  83. Btoa uses characters between '!' and 'u'. Special characters are
  84. 'z' meaning 4 consecutive zeros, 'y' meaning 4 spaces, and
  85. 'x' as an end-of-archive mark. The 'y' was added be me, and will
  86. not be recognized by the old version.
  87.  
  88. Old btoa encoding is still possible, as an extra option (see the
  89. manual). When decoding, btoa can tell if it's the old or new btoa
  90. format by looking at the header.
  91.  
  92. I removed the feature to exit with no output if there was en error
  93. in the archive. This was done by using a temporary file for
  94. storage. This is not a good idea for micro computer folks like
  95. me, with limited storage possibilities. I hope all realize that
  96. you shouldn't run a file that was created from a corrupted archive.
  97.  
  98. Most of the code was rewritten in order to make it execute faster.
  99. Special efforts have been made to optimize the atob part.
  100. Measured speeds are 30 kbyte/s on a Sun-3 and 4 kbyte/s on an
  101. Amiga. On the Amiga I used the VD0: recoverable RAM disk without
  102. FFS.
  103.  
  104. I have tested btoa on an Amiga 1000 and a Sun-3, and it has
  105. worked very well. If you find it doesn't work on your favourite
  106. computer, drop me a note to one of the addresses below, preferably
  107. the top one, and I'll see what I can do. Also, if you port and/or
  108. improve it, please send me the diffs, and I'll include them in the
  109. next release.
  110.  
  111. ---------------------- DISCLAIMER -------------------------------
  112.  
  113. I assume no responsibility for the use of btoa. It should work OK,
  114. and I have included lots of tests to make sure that files open,
  115. end-of-file is detected, etc.
  116.  
  117. Btoa is in the public domain. You may use it, give it away, and
  118. make improvements, as long as the names of the developers are
  119. mentioned and you don't use it to earn money. It may NOT be used
  120. commercially without my permission.
  121.  
  122. /Stefan Parmark
  123.         d84sp@efd.lth.se
  124.         d84spa@rigel.sunet.se
  125. SHAR_EOF
  126. cat << \SHAR_EOF > Makefile.amiga_lattice
  127. OBJS     = btoa.o atob.o repair.o
  128. CFLAGS   = -cef -dLATTICE -v -w
  129.  
  130. btoa     : $(OBJS)
  131.            blink lib:c.o $(OBJS) TO btoa LIB lib:lcs.lib SC SD ND
  132.  
  133. atob.o   : atob.c btoa.h chksum.h
  134. btoa.o   : btoa.c btoa.h chksum.h
  135. repair.o : repair.c btoa.h
  136. SHAR_EOF
  137. cat << \SHAR_EOF > Makefile.sun
  138. OBJS     = btoa.o atob.o repair.o
  139.  
  140. btoa     : $(OBJS)
  141.            cc -O $(OBJS) -o btoa
  142.  
  143. btoa.o   : btoa.c btoa.h chksum.h
  144.            cc -c -O btoa.c
  145. atob.o   : atob.c btoa.h chksum.h
  146.            cc -c -O atob.c
  147. repair.o : repair.c btoa.h
  148.            cc -c -O repair.c
  149. SHAR_EOF
  150. cat << \SHAR_EOF > atob.c
  151. /* atob.c */
  152.  
  153. /* Written by Paul Rutter, Joe Orost & Stefan Parmark. */
  154.  
  155. #include <stdio.h>
  156. #ifdef AMIGA
  157. #include <stdlib.h>
  158. #include <string.h>
  159. #endif AMIGA
  160.  
  161. #include "btoa.h"
  162. #if USE_MACROS
  163. #include "chksum.h"
  164. #endif USE_MACROS
  165.  
  166.  
  167. BYTE atob(infile)
  168. register FILE *infile;
  169. {
  170.   register BYTE error;
  171.   register LONG filepos;
  172.   int maxperline;
  173.   LONG n1, n2, oeor, osum, orot, lastline;
  174.   static BYTE outfilename[BUFSIZE];
  175.   extern LONG Ceor, Csum, Crot;
  176.   extern FILE *outfile;
  177.   extern BYTE new_version, openoutput, buffer[BUFSIZE];
  178.  
  179.   error = FALSE;
  180.  
  181.   /* Search for archive header. */
  182.   do
  183.   {
  184.     filepos = ftell(infile);
  185.  
  186.     if (readbuffer(buffer, "archive", infile))
  187.       error = TRUE;
  188.   }
  189.   while (!(error || strncmp(buffer, "xbtoa", 5) == 0));
  190.  
  191.   if (!error)
  192.     if (strcmp(buffer, "xbtoa Begin\n") == 0)
  193.     {
  194.       new_version = FALSE;
  195.       fprintf(stderr, "btoa: Old btoa format.\n");
  196.     }
  197.     else if (sscanf(buffer, "xbtoa5 %d %s Begin\n", &maxperline, outfilename) == 2)
  198.     {
  199.       new_version = TRUE;
  200.       /* Naming a file overrides the read-name-from-file function. */
  201.       if (!openoutput && strcmp(outfilename, "-") != 0)
  202.         if ((outfile = fopen_write(outfilename)) == NULL)
  203.           error = TRUE;
  204.         else
  205.           openoutput = TRUE;
  206.     }
  207.     else
  208.     {
  209.       fprintf(stderr, "btoa: Illegal archive header.\n");
  210.       error = TRUE;
  211.     }
  212.  
  213.   if (!error)
  214.   {
  215.     Ceor = Csum = Crot = 0;
  216.  
  217.     if (new_version)
  218.       error = new_decodefile(infile, &lastline, filepos, maxperline);
  219.     else
  220.       error = old_decodefile(infile, &lastline);
  221.   }
  222.  
  223.   if (!error)
  224.   {
  225.     if (sscanf(buffer, "xbtoa End N %ld %lx E %lx S %lx R %lx\n",
  226.         &n1, &n2, &oeor, &osum, &orot) != 5)
  227.     {
  228.       fprintf(stderr, "btoa: Bad format on line %ld. Can't repair file.\n",
  229.           lastline);
  230.       error = TRUE;
  231.     }
  232.     else if ((n1 != n2) || (oeor != Ceor) || (osum != Csum) || (orot != Crot))
  233.     {
  234.       fprintf(stderr, "btoa: Bad file checksum. Can't repair file.\n");
  235.       error = TRUE;
  236.     }
  237.     else
  238.       /* Flush last characters. */
  239.       decode_line(NULL, (int) ((n1 - 1) & 0x03));
  240.   }
  241.  
  242.   return(error);
  243. }
  244.  
  245.  
  246. /* Peek at the next byte without moving the file pointer. */
  247. int nextbyte(infile)
  248. register FILE *infile;
  249. {
  250.   register int ch;
  251.   register LONG filepos;
  252.  
  253.   filepos = ftell(infile);
  254.   ch = fgetc(infile);
  255.   fseek(infile, filepos, 0);
  256.  
  257.   return(ch);
  258. }
  259.  
  260.  
  261. BYTE new_decodefile(infile, lastline, filepos, maxperline)
  262. register FILE *infile;
  263. LONG *lastline, filepos;
  264. int maxperline;
  265. {
  266.   register int length;
  267.   int ch;
  268.   register BYTE stop, error, newerror, errorstart;
  269.   register LONG line, prevfilepos, startpos;
  270.   struct Diagnosis diagnosislist;
  271.   extern LONG Csum;
  272.   extern BYTE buffer[BUFSIZE];
  273.  
  274.   error = FALSE;
  275.  
  276.   line = 1;  /* Current line number. */
  277.  
  278.   /* A sequence of errors is indicated by errorstart. When it */
  279.   /* changes from TRUE to FALSE a diagnosis record will be    */
  280.   /* generated.                                               */
  281.   stop = errorstart = FALSE;
  282.  
  283.   /* File position of the line before the error sequence.     */
  284.   /* That is the last correct line.                           */
  285.   startpos = 0;
  286.  
  287.   while (!stop)
  288.   {
  289.     prevfilepos = filepos;
  290.     filepos = ftell(infile);
  291.  
  292.     /* Newerror indicates an error on the current line. */
  293.     newerror = FALSE;
  294.  
  295.     line++;
  296.     if (readbuffer(buffer, "archive", infile))
  297.       newerror = stop = TRUE;
  298.     else if (buffer[0] == 'x')  /* End of archive found. */
  299.       stop = TRUE;
  300.     else if ((length = strlen(buffer) - 1) != maxperline ||
  301.              buffer[length] != '\n')
  302.     {
  303.       /* If last character wasn't end-of-line, then we */
  304.       /* have to read until it is found.               */
  305.       if (buffer[length] != '\n')
  306.       {
  307.         newerror = TRUE;
  308.         while ((ch = fgetc(infile)) != EOF && (BYTE)ch != '\n')
  309.           ;
  310.         if (ch == EOF)
  311.           stop = TRUE;
  312.       }
  313.       else if (length > maxperline || nextbyte(infile) != 'x')
  314.       {
  315.         newerror = TRUE;
  316.         Csum = DECODE(buffer[length - 1]);  /* Make Csum correct (modulo 85). */
  317.       }
  318.  
  319.       if (newerror)
  320.         fprintf(stderr, "btoa: Bad line length on line %ld.\n", line);
  321.     }
  322.  
  323.     if (!(newerror || stop))
  324.     {
  325.       if (decode_line(buffer, length - 1))
  326.       {
  327.         if (!error)
  328.           fprintf(stderr, "btoa: Bad character on line %ld.\n", line);
  329.         newerror = TRUE;
  330.       }
  331.  
  332.       /* Examine checksum. */
  333.       if ((ch = buffer[length - 1]) == ENCODE(Csum % 85))
  334.       {
  335.         if (errorstart)
  336.         {
  337.           intodiagnosislist(&diagnosislist, startpos, filepos);
  338.           errorstart = FALSE;
  339.         }
  340.       }
  341.       else
  342.       {
  343.         newerror = TRUE;
  344.         fprintf(stderr, "btoa: Bad checksum on line %ld.\n", line);
  345.         Csum = DECODE(ch);  /* Make Csum correct (modulo 85). */
  346.       }
  347.     }
  348.  
  349.     if (newerror)
  350.     {
  351.       if (!error)
  352.       {
  353.         fprintf(stderr, "btoa: Starting diagnosis.\n");
  354.         diagnosislist.next = diagnosislist.last = NULL;
  355.       }
  356.  
  357.       error = TRUE;
  358.       if (!errorstart)
  359.       {
  360.         errorstart = TRUE;
  361.         startpos = prevfilepos;
  362.       }
  363.     }
  364.   }
  365.  
  366.   if (error)
  367.   {
  368.     if (errorstart)
  369.       intodiagnosislist(&diagnosislist, startpos, filepos);
  370.     producediagnosis(&diagnosislist, infile);
  371.   }
  372.  
  373.   *lastline = line;
  374.  
  375.   return(error);
  376. }
  377.  
  378.  
  379.  
  380. BYTE old_decodefile(infile, lastline)
  381. register FILE *infile;
  382. LONG *lastline;
  383. {
  384.   register int length;
  385.   register BYTE stop, error;
  386.   register LONG line;
  387.   extern BYTE buffer[BUFSIZE];
  388.  
  389.   error = FALSE;
  390.  
  391.   line = 1;
  392.   stop = FALSE;
  393.   while (!stop)
  394.   {
  395.     line ++;
  396.  
  397.     if (readbuffer(buffer, "archive", infile))
  398.       error = stop = TRUE;
  399.     else if (buffer[0] == 'x')  /* End of archive found. */
  400.       stop = TRUE;
  401.     else
  402.     {
  403.       length = strlen(buffer) - 1;
  404.       if (buffer[length] != '\n')
  405.         error = stop = TRUE;  /* The line was longer than the buffer. */
  406.     }
  407.  
  408.     if (!stop)
  409.     {
  410.       if (decode_line(buffer, length))
  411.       {
  412.         fprintf(stderr, "btoa: Bad character on line %ld.\n", line);
  413.         error = stop = TRUE;
  414.       }
  415.     }
  416.   }
  417.  
  418.   *lastline = line;
  419.  
  420.   return(error);
  421. }
  422.  
  423.  
  424. BYTE decode_line(buffer, length)
  425. register BYTE *buffer;
  426. register int length;
  427. {
  428.   register int ch;
  429.   register BYTE error;
  430.   register LONG tmp_codeword;
  431.   extern BYTE new_version;
  432.   extern FILE *outfile;
  433.   static LONG codeword;
  434.   static int ch1, ch2, ch3, ch4;
  435.   static BYTE bytecount = 0;
  436.  
  437.   error = FALSE;
  438.  
  439.   if (buffer == NULL)  /* Flush last characters. */
  440.   {
  441.     if (bytecount > 0)
  442.     {
  443.       fputc(ch1, outfile);
  444.       if (length > 0)
  445.         fputc(ch2, outfile);
  446.       if (length > 1)
  447.         fputc(ch3, outfile);
  448.       if (length > 2)
  449.         fputc(ch4, outfile);
  450.     }
  451.   }
  452.   else
  453.   {
  454.     while (length > 0)
  455.     {
  456.       length--;
  457.       ch = *buffer++;
  458.  
  459.       /* Delayed output. This is to make sure that files with lengths */
  460.       /* that are not multiples of 4 won't become too long.           */
  461.       if (bytecount == 5)
  462.       {
  463.         fputc(ch1, outfile);
  464.         fputc(ch2, outfile);
  465.         fputc(ch3, outfile);
  466.         fputc(ch4, outfile);
  467.  
  468.         bytecount = 0;
  469.       }
  470.  
  471.       if (new_version)
  472.         calcchecksum(ch);
  473.  
  474.       if (((BYTE)ch >= '!') && ((BYTE)ch < ('!' + 85)))  /* Valid characters. */
  475.       {
  476.         /* See if we can take all 5 bytes and decode them right away. */
  477.         /* That is, if all remaining bytes are on the current line.   */
  478.         if (length >= 4 - bytecount)
  479.         {
  480.           length -= 4 - bytecount;
  481.  
  482.           if (bytecount == 0)
  483.             codeword = DECODE(ch);
  484.           else
  485.             codeword = codeword * 85 + DECODE(ch);
  486.  
  487.           for (bytecount++; bytecount < 5; bytecount++)
  488.           {
  489.             ch = *buffer++;
  490.             if (new_version)
  491.               calcchecksum(ch);
  492.             codeword = codeword * 85 + DECODE(ch);
  493.           }
  494.         }
  495.         else
  496.         {
  497.           /* Shift codeword and insert character. */
  498.  
  499.           if (bytecount == 0)
  500.           {
  501.             codeword = DECODE(ch);
  502.             bytecount = 1;
  503.           } 
  504.           else /* bytecount < 5 */
  505.           {
  506.             codeword = codeword * 85 + DECODE(ch);
  507.             bytecount ++;
  508.           }
  509.         }
  510.  
  511.         if (bytecount == 5)
  512.         {
  513.           tmp_codeword = codeword;
  514.  
  515.           ch4 = (int)tmp_codeword & 0xFF;
  516.           ch3 = (int)(tmp_codeword >>= 8) & 0xFF;
  517.           ch2 = (int)(tmp_codeword >>= 8) & 0xFF;
  518.           ch1 = (int)(tmp_codeword >> 8) & 0xFF;
  519.  
  520.           if (!new_version)
  521.           {
  522.             calcchecksum(ch1);
  523.             calcchecksum(ch2);
  524.             calcchecksum(ch3);
  525.             calcchecksum(ch4);
  526.           }
  527.         }
  528.       }
  529.       else if ((BYTE)ch == 'z' || (new_version && (BYTE)ch == 'y'))
  530.       {
  531.         if (bytecount != 0)
  532.           error = TRUE;
  533.         else
  534.         {
  535.           ch1 = ch2 = ch3 = ch4 = (ch == 'z') ? 0 : ' ';
  536.           if (!new_version)
  537.           {
  538.             calcchecksum(ch1);
  539.             calcchecksum(ch1);
  540.             calcchecksum(ch1);
  541.             calcchecksum(ch1);
  542.           }
  543.           bytecount = 5;
  544.         }
  545.       }
  546.       else
  547.         error = TRUE;
  548.     }
  549.   }
  550.  
  551.   return(error);
  552. }
  553. SHAR_EOF
  554. cat << \SHAR_EOF > btoa.1
  555. .TH BTOA 1 "21 February 1989"
  556. .| btoa version 5.2
  557. .SH NAME
  558. btoa - encode/decode binary to printable ASCII
  559. .SH SYNOPSIS
  560. btoa [-adhor] [input filename] [output filename]
  561. .SH DESCRIPTION
  562. .I Btoa
  563. is a filter which reads binary bytes from the input file and
  564. generates printable ASCII characters on the output file. It attaches
  565. a header and a checksum to the archive. It can also reverse this,
  566. creating a binary file from the archive.
  567. .LP
  568. Since last version of
  569. .I btoa/atob,
  570. several new features have been
  571. added. The most obvious one is that
  572. .I atob
  573. has been integrated
  574. with
  575. .I btoa.
  576. They are now the same program which is called with
  577. different arguments. Another is the ability to repair damaged
  578. archives.
  579. .LP
  580. The new version is compatible with the old version, that is,
  581. it can still encode and decode old btoa files.
  582. .LP
  583. .I Btoa
  584. has an option to decode the archive, restoring the binary bytes.
  585. It strips the input file until it finds a valid header, and continues
  586. decoding until the end mark is found. It recognices both old- and
  587. new-style headers, and can decode both. It is possible to leave out
  588. the destination name when decoding new-style archives, because the
  589. name is stored in the header. Entering a name will override the
  590. autonaming function.
  591. .LP
  592. It is possible to leave out the file names and redirect stdin and
  593. stdout with '<' and '>' to the desired files. This is to maintain
  594. compatibility with earlier versions of
  595. .I btoa.
  596. .LP
  597. .I Btoa
  598. now adds a single byte checksum to each row in the archive.
  599. When an error is found, diagnosis automatically starts and produces
  600. a diagnosis file which can be used to extract the damaged part from
  601. an errorfree archive. The extracted part can then be used to correct
  602. the damaged archive.
  603. .I Btoa
  604. has options to perform the reparation
  605. automatically. This is especially useful when downloading data
  606. converted to text files, and occasionally finding that an archive
  607. file of considerable size turns is corrupted.
  608. .SH FEATURES
  609. .I Btoa
  610. encodes 4 binary bytes into 5 characters, expanding the file by
  611. 25%. As a special case 4 zeroes will be encoded as 'z' and 4
  612. spaces as 'y'. This makes it possible to compress the archive a bit.
  613. .SH OPTIONS
  614. .IP -h
  615. Shows help on 
  616. .I btoa.
  617. .LP
  618. .IP-a
  619. Switches to
  620. .I atob
  621. (decoding) mode.
  622. .LP
  623. .IP -o
  624. Switches to old version of
  625. .I btoa.
  626. .LP
  627. .IP -d
  628. Extracts repair file from diagnosis file. This assumes that
  629. an undamaged version of the archive and a file called
  630. 'btoa.dia' is present.
  631. .LP
  632. .IP-r
  633. Repairs the damaged archive. A file named 'btoa.rep' must
  634. be present for this to work.
  635. .SH EXAMPLES
  636. Below follows a description of a normal repair session. Lines
  637. beginning with 'Local>' were typed on the computer to which the
  638. file was downloaded. Accordingly, lines typed on the connected
  639. computer will begin with 'Remote>'. Sending a file to the other
  640. computer will be noted as 'transmit file'.
  641. .LP
  642. A normal repairing procedure is as follows:
  643. Local> btoa -a file.btoa
  644. btoa: Bad checksum on line 2648.
  645. btoa: Starting diagnosis.
  646. btoa: Diagnosis output to 'btoa.dia'.
  647. Local> transmit btoa.dia
  648. .LP
  649. Remote> btoa -d file.btoa
  650. btoa: Repair output to 'btoa.rep'.
  651. Remote> transmit btoa.rep
  652. .LP
  653. Local> btoa -a btoa.rep
  654. btoa: Repaired archive written to 'btoa.rdy'.
  655. .LP
  656. You can now erase file.btoa and decode btoa.rdy using 'btoa -a btoa.rdy'.
  657. .SH AUTHORS
  658. Paul Rutter  Joe Orost  Stefan Parmark
  659. .SH KNOWN BUGS
  660. .I Btoa
  661. will not work properly unless the input is a true file or a
  662. redirected one. This is because file positions are collected during
  663. diagnosis for later reference when producing the diagnosis file.
  664. The bug is actually in fseek() which only can reposition 'real' files.
  665. .LP
  666. Send bug reports to d84sp@efd.lth.se (Stefan Parmark).
  667. SHAR_EOF
  668. cat << \SHAR_EOF > btoa.c
  669. /* btoa.c */
  670.  
  671. /* Written by Paul Rutter, Joe Orost & Stefan Parmark. */
  672.  
  673. #include <stdio.h>
  674. #ifdef AMIGA
  675. #include <stdlib.h>
  676. #include <string.h>
  677. #endif AMIGA
  678.  
  679. #include "btoa.h"
  680. #if USE_MACROS
  681. #include "chksum.h"
  682. #endif USE_MACROS
  683.  
  684. #define VERSION  "5.2"
  685.  
  686. LONG Ceor, Csum, Crot;  /* Checksums to verify archive validity. */
  687. BYTE new_version, openoutput, buffer[BUFSIZE];
  688. FILE *outfile;
  689.  
  690.  
  691. void main(argc, argv)
  692. int argc;
  693. BYTE **argv;
  694. {
  695.   register BYTE openinput, error, ch, a_to_b, diagnosis, repair;
  696.   register BYTE *infilename, *text;
  697.   register FILE *infile;
  698.   extern BYTE new_version, openoutput;
  699.   extern FILE *outfile;
  700. #ifdef AMIGA
  701.   extern int _bufsiz;
  702.  
  703.   /* Change file buffer size. */
  704.   _bufsiz = 10240;
  705. #endif AMIGA
  706.  
  707.   error = openinput = openoutput = a_to_b = diagnosis = repair = FALSE;
  708.   new_version = TRUE;
  709.   infilename = NULL;
  710.  
  711.   /* Scan for '-' options. The rest must be file names. */
  712.   while (!error && argc > 1 && *argv[1] == '-')
  713.   {
  714.     text = &argv[1][1];
  715.     while (!error && (ch = *text++) != 0)
  716.     {
  717.       switch(ch)
  718.       {
  719.         case 'a' : /* Activate atob. */
  720.                    a_to_b = TRUE;
  721.                    break;
  722.         case 'd' : /* Extract missing part from undamaged archive. */
  723.                    diagnosis = TRUE;
  724.                    break;
  725.         case 'h' : /* Print help and abort execution. */
  726.                    error = TRUE;
  727.                    break;
  728.         case 'o' : /* Use old btoa format. */
  729.                    new_version = FALSE;
  730.                    break;
  731.         case 'r' : /* Repair damaged archive. */
  732.                    repair = TRUE;
  733.                    break;
  734.         default  : error = TRUE;
  735.       }
  736.     }
  737.     argv++;
  738.     argc--;
  739.   }
  740.  
  741.   if (argc > 3)
  742.     error = TRUE;
  743.  
  744.   if (error)
  745.     printhelp();
  746.   else
  747.   {
  748.     /* If file name was given, try to open file. Otherwise use stdin. */
  749.     if (argc > 1)
  750.     {
  751.       infilename = argv[1];
  752.       if ((infile = fopen_read(infilename)) == NULL)
  753.         error = TRUE;
  754.       else
  755.         openinput = TRUE;
  756.     }
  757.     else
  758.       infile = stdin;
  759.   }
  760.  
  761.   if (!error)
  762.   {
  763.     /* If file name was given, try to open file. Otherwise use stdout. */
  764.     if (argc > 2 && !diagnosis && !repair)
  765.     {
  766.       if ((outfile = fopen_write(argv[2])) == NULL)
  767.         error = TRUE;
  768.       else
  769.         openoutput = TRUE;
  770.     }
  771.     else
  772.       outfile = stdout;
  773.   }
  774.  
  775.   if (!error)
  776.   {
  777.     if (diagnosis)
  778.       error = producerepair(infile);
  779.     else if (repair)
  780.       error = performrepair(infile);
  781.     else if (a_to_b)
  782.       error = atob(infile);
  783.     else
  784.       error = btoa(infile, infilename);
  785.   }
  786.  
  787.   /* Close all opened files. */
  788.   if (openinput)
  789.     fclose(infile);
  790.   if (openoutput)
  791.     fclose(outfile);
  792.  
  793.   if (error)
  794.     exit(1);
  795. }
  796.  
  797.  
  798. BYTE btoa(infile, infilename)
  799. register FILE *infile;
  800. register BYTE *infilename;
  801. {
  802.   register LONG codeword, filesize;
  803.   register int ch1, ch2, ch3, ch4, readbytes;
  804.   extern FILE *outfile;
  805.   extern BYTE new_version, buffer[BUFSIZE];
  806.   extern LONG Ceor, Csum, Crot;
  807.  
  808.   Ceor = Csum = Crot = 0;
  809.  
  810.   /* Write archive header. */
  811.   if (new_version)
  812.   {
  813.     fprintf(outfile, "xbtoa5 %d %s Begin\n", MAXPERLINE,
  814.         (infilename == NULL) ? "-" : truncname(infilename));
  815.   }
  816.   else
  817.     fprintf(outfile, "xbtoa Begin\n");
  818.  
  819.   /* Encode entire input file. */
  820.   filesize = 0;
  821.   do
  822.   {
  823.     readbytes = fread(buffer, 1, 4, infile);
  824.  
  825.     if (readbytes < 4)
  826.     {
  827.       ch1 = (readbytes > 0) ? ((int)buffer[0] & 0xFF) : 0;
  828.       ch2 = (readbytes > 1) ? ((int)buffer[1] & 0xFF) : 0;
  829.       ch3 = (readbytes > 2) ? ((int)buffer[2] & 0xFF) : 0;
  830.       ch4 = 0;
  831.     }
  832.     else
  833.     {
  834.       ch1 = (int)buffer[0] & 0xFF;
  835.       ch2 = (int)buffer[1] & 0xFF;
  836.       ch3 = (int)buffer[2] & 0xFF;
  837.       ch4 = (int)buffer[3] & 0xFF;
  838.     }
  839.  
  840.     if (readbytes > 0)
  841.     {
  842.       if (!new_version)
  843.       {
  844.         calcchecksum(ch1);
  845.         calcchecksum(ch2);
  846.         calcchecksum(ch3);
  847.         calcchecksum(ch4);
  848.       }
  849.  
  850.       codeword = (ch1 << 8) | ch2;
  851.       codeword = (((codeword << 8) | ch3) << 8) | ch4;
  852.       wordout(codeword);
  853.  
  854.       filesize += readbytes;
  855.     }
  856.   }
  857.   while (readbytes == 4);
  858.  
  859.   asciiout(EOF);  /* Flush buffer. */
  860.  
  861.   /* Filesize is written twice as crude cross check. */
  862.   fprintf(outfile, "xbtoa End N %ld %lx E %lx S %lx R %lx\n",
  863.         filesize, filesize, Ceor, Csum, Crot);
  864.  
  865.   return(FALSE);  /* No errors discovered. */
  866. }
  867.  
  868.  
  869. /* Print help on how to use btoa. */
  870. void printhelp()
  871. {
  872.   fprintf(stderr, "              Btoa version %s\n", VERSION);
  873.   fprintf(stderr, "Written by Paul Rutter, Joe Orost & Stefan Parmark.\n");
  874.  
  875.   fprintf(stderr, "\nUsage: btoa [-{adhor}] [input file] [output file]\n");
  876.  
  877.   fprintf(stderr, "\nOptions:\n");
  878.   fprintf(stderr, "-h  Shows this help list.\n");
  879.   fprintf(stderr, "-a  Use atob rather than btoa.\n");
  880.   fprintf(stderr, "-o  Use old version of btoa.\n");
  881.   fprintf(stderr, "-d  Extract repair file from diagnosis file.\n");
  882.   fprintf(stderr, "-r  Repair archive from repair file.\n");
  883.  
  884.   fprintf(stderr, "\nExamples:\n");
  885.   fprintf(stderr, "  btoa -h\n");
  886.   fprintf(stderr, "  btoa [input binary file] [output archive file]\n");
  887.   fprintf(stderr, "  btoa -o [input binary file] [output archive file]\n");
  888.   fprintf(stderr, "  btoa -a [input archive file] [output binary file]\n");
  889.   fprintf(stderr, "  btoa -d [undamaged archive file]\n");
  890.   fprintf(stderr, "  btoa -r [damaged archive file]\n");
  891. }
  892.  
  893.  
  894. #if !USE_MACROS
  895. /* Update file checksums. */
  896. void calcchecksum(ch)
  897. register int ch;
  898. {
  899.   extern LONG Ceor, Csum, Crot;
  900.  
  901.   Ceor ^= ch;
  902.   Csum += ch + 1;
  903.  
  904.   if (Crot & 0x80000000L)
  905.     ch ++;
  906.   Crot <<= 1;
  907.   Crot += ch;
  908. }
  909. #endif !USE_MACROS
  910.  
  911.  
  912. /* Encode 4 binary bytes to 5 ascii bytes. */
  913. void wordout(codeword)
  914. register LONG codeword;
  915. {
  916.   register int tmp, quote;
  917.   extern BYTE new_version;
  918.  
  919.   if (codeword == 0)
  920.     /* Encode 4 zeros as a 'z'. */
  921.     asciiout('z');
  922.   else if (new_version && codeword == 0x20202020)
  923.     /* Encode 4 spaces as a 'y'. */
  924.     asciiout('y');
  925.   else
  926.   {
  927.     tmp = 0;
  928.  
  929.     /* Extra calculations because some machines don't support */
  930.     /* unsigned longwords.                                    */
  931.     if (codeword < 0)
  932.     {
  933.       tmp = 32;
  934.       codeword -= (LONG)(85L * 85 * 85 * 85 * 32);
  935.     }
  936.     if (codeword < 0)
  937.     {
  938.       tmp = 64;
  939.       codeword -= (LONG)(85L * 85 * 85 * 85 * 32);
  940.     }
  941.  
  942.     /* Write 5 ascii bytes representing 4 binary bytes. */
  943.  
  944.     quote = codeword / (LONG)(85L * 85 * 85 * 85);
  945.     codeword -= quote * (LONG)(85L * 85 * 85 * 85);
  946.     asciiout(ENCODE(quote + tmp));
  947.  
  948.     quote = codeword / (LONG)(85L * 85 * 85);
  949.     codeword -= quote * (LONG)(85L * 85 * 85);
  950.     asciiout(ENCODE(quote));
  951.  
  952.     quote = codeword / (LONG)(85L * 85);
  953.     codeword -= quote * (LONG)(85L * 85);
  954.     asciiout(ENCODE(quote));
  955.  
  956.     quote = (int)codeword / 85;
  957.     codeword -= quote * 85;
  958.     asciiout(ENCODE(quote));
  959.  
  960.     asciiout(ENCODE((int)codeword));
  961.   }
  962. }
  963.  
  964.  
  965. /* Write ch to outfile. Write '\n' for every line. */
  966. void asciiout(ch)
  967. register int ch;
  968. {
  969.   static WORD linepos = 0;
  970.   extern FILE *outfile;
  971.   extern LONG Csum;
  972.   extern BYTE new_version;
  973.  
  974.   if (ch == EOF)  /* Signal to flush buffer. */
  975.   {
  976.     /* Linepos == 0 means '\n' just written in asciiout(). This */
  977.     /* avoids bug in BITNET, which changes blank line to spaces. */
  978.     if (linepos != 0)
  979.     {
  980.       if (new_version)
  981.         fputc(ENCODE(Csum % 85), outfile); /* Checksum for every line. */
  982.       fputc('\n', outfile);
  983.     }
  984.   }
  985.   else
  986.   {
  987.     fputc(ch, outfile);
  988.     linepos ++;
  989.  
  990.     if (new_version)
  991.     {
  992.       calcchecksum(ch);
  993.       if (linepos >= (MAXPERLINE-1))
  994.       {
  995.         fputc(ENCODE(Csum % 85), outfile); /* Checksum for every line. */
  996.         fputc('\n', outfile);
  997.         linepos = 0;
  998.       }
  999.     }
  1000.     else  /* Old version */
  1001.       if (linepos >= MAXPERLINE)
  1002.       {
  1003.         fputc('\n', outfile);
  1004.         linepos = 0;
  1005.       }
  1006.  
  1007.   }
  1008. }
  1009.  
  1010.  
  1011. /* Remove paths from a file name. */
  1012. BYTE *truncname(name)
  1013. register BYTE *name;
  1014. {
  1015.   register BYTE ch, *newname;
  1016.  
  1017.   newname = name;
  1018.   while ((ch = *name++) != 0)
  1019.     if (ch == '/' || ch == ':')
  1020.       newname = name;
  1021.  
  1022.   return(newname);
  1023. }
  1024. SHAR_EOF
  1025. cat << \SHAR_EOF > btoa.doc
  1026.  
  1027.  
  1028.  
  1029. BTOA(1)                  USER COMMANDS                    BTOA(1)
  1030.  
  1031.  
  1032.  
  1033. NAME
  1034.      btoa - encode/decode binary to printable ASCII
  1035.  
  1036. SYNOPSIS
  1037.      btoa -adhor input filename output filename
  1038.  
  1039. DESCRIPTION
  1040.      Btoa is a filter which reads binary  bytes  from  the  input
  1041.      file  and generates printable ASCII characters on the output
  1042.      file. It attaches a header and a checksum to the archive. It
  1043.      can  also  reverse  this,  creating  a  binary file from the
  1044.      archive.
  1045.  
  1046.      Since last version of btoa/atob, several new  features  have
  1047.      been  added.  The  most  obvious  one  is that atob has been
  1048.      integrated with btoa. They are now the same program which is
  1049.      called  with  different arguments. Another is the ability to
  1050.      repair damaged archives.
  1051.  
  1052.      The new version is compatible with the old version, that is,
  1053.      it can still encode and decode old btoa files.
  1054.  
  1055.      Btoa has an option to  decode  the  archive,  restoring  the
  1056.      binary  bytes.   It  strips  the input file until it finds a
  1057.      valid header, and continues decoding until the end  mark  is
  1058.      found.  It  recognices  both old- and new-style headers, and
  1059.      can decode both. It is possible to leave out the destination
  1060.      name  when  decoding new-style archives, because the name is
  1061.      stored in the header. Entering  a  name  will  override  the
  1062.      autonaming function.
  1063.  
  1064.      It is possible to leave out  the  file  names  and  redirect
  1065.      stdin and stdout with '<' and '>' to the desired files. This
  1066.      is to maintain compatibility with earlier versions of btoa.
  1067.  
  1068.      Btoa now adds a single byte checksum  to  each  row  in  the
  1069.      archive.   When  an  error is found, diagnosis automatically
  1070.      starts and produces a diagnosis file which can  be  used  to
  1071.      extract  the  damaged  part  from  an errorfree archive. The
  1072.      extracted part can then  be  used  to  correct  the  damaged
  1073.      archive.    Btoa  has  options  to  perform  the  reparation
  1074.      automatically. This is especially  useful  when  downloading
  1075.      data  converted to text files, and occasionally finding that
  1076.      an archive file of considerable size turns is corrupted.
  1077.  
  1078. FEATURES
  1079.      Btoa encodes 4 binary bytes into 5 characters, expanding the
  1080.      file  by  25%. As a special case 4 zeroes will be encoded as
  1081.      'z' and 4 spaces as 'y'. This makes it possible to  compress
  1082.      the archive a bit.
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.                   Last change: 21 February 1989                 1
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095. BTOA(1)                  USER COMMANDS                    BTOA(1)
  1096.  
  1097.  
  1098.  
  1099. OPTIONS
  1100.      -h   Shows help on btoa.
  1101.  
  1102.      -a   Switches to atob (decoding) mode.
  1103.  
  1104.      -o   Switches to old version of btoa.
  1105.  
  1106.      -d   Extracts repair file from diagnosis file. This  assumes
  1107.           that  an  undamaged  version  of the archive and a file
  1108.           called
  1109.  
  1110.      -r   Repairs the damaged archive. A  file  named  'btoa.rep'
  1111.           must be present for this to work.
  1112.  
  1113. EXAMPLES
  1114.      Below follows a description  of  a  normal  repair  session.
  1115.      Lines  beginning with 'Local>' were typed on the computer to
  1116.      which the file was downloaded. Accordingly, lines  typed  on
  1117.      the  connected computer will begin with 'Remote>'. Sending a
  1118.      file to the other computer will be noted as 'transmit file'.
  1119.  
  1120.      A normal repairing procedure is as follows: Local>  btoa  -a
  1121.      file.btoa  btoa:  Bad checksum on line 2648.  btoa: Starting
  1122.      diagnosis.  btoa: Diagnosis output  to  'btoa.dia'.   Local>
  1123.      transmit btoa.dia
  1124.  
  1125.      Remote> btoa -d file.btoa btoa: Repair output to 'btoa.rep'.
  1126.      Remote> transmit btoa.rep
  1127.  
  1128.      Local> btoa -a btoa.rep btoa: Repaired  archive  written  to
  1129.      'btoa.rdy'.
  1130.  
  1131.      You can now erase file.btoa and decode btoa.rdy using  'btoa
  1132.      -a btoa.rdy'.
  1133.  
  1134. AUTHORS
  1135.      Paul Rutter  Joe Orost  Stefan Parmark
  1136.  
  1137. KNOWN BUGS
  1138.      Btoa will not work properly unless the input is a true  file
  1139.      or a redirected one. This is because file positions are col-
  1140.      lected during diagnosis for later reference  when  producing
  1141.      the  diagnosis  file.   The bug is actually in fseek() which
  1142.      only can reposition 'real' files.
  1143.  
  1144.      Send bug reports to d84sp@efd.lth.se (Stefan Parmark).
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.                   Last change: 21 February 1989                 2
  1155.  
  1156.  
  1157.  
  1158. SHAR_EOF
  1159. cat << \SHAR_EOF > btoa.h
  1160. /* btoa.h */
  1161.  
  1162. #define MAXPERLINE      78
  1163. #define BUFSIZE         100
  1164. #define TRUE            1
  1165. #define FALSE           0
  1166. #define USE_MACROS      TRUE
  1167.  
  1168. #define BYTE            char
  1169. #define WORD            short
  1170. #define LONG            long
  1171.  
  1172. #define ENCODE(ch)      ( (int) ((ch) + '!') )
  1173. #define DECODE(ch)      ( (int) ((ch) - '!') )
  1174.  
  1175. struct Diagnosis
  1176. {
  1177.   LONG startpos, endpos;  /* Line before and after erroneous area */
  1178.   struct Diagnosis *next, *last;
  1179. };
  1180.  
  1181.  
  1182. /*
  1183. Following functions have been converted to macros:
  1184.   calcchecksum()
  1185. */
  1186.  
  1187.  
  1188. #if LATTICE  /* Prototypes for Lattice C */
  1189.  
  1190. void asciiout(int), exit(int),
  1191.      intodiagnosislist(struct Diagnosis *, LONG, LONG),
  1192.      outdiagnosislist(struct Diagnosis *, LONG *, LONG *), printhelp(void),
  1193.      producediagnosis(struct Diagnosis *, FILE *), wordout(LONG);
  1194.  
  1195. BYTE atob(FILE *), btoa(FILE *, BYTE *), copyfile(FILE *, FILE *, BYTE *),
  1196.      decode_line(BYTE *, int), new_decodefile(FILE *, LONG *, LONG, int),
  1197.      old_decodefile(FILE *, LONG *), performrepair(FILE *),
  1198.      producerepair(FILE *), readbuffer(BYTE *, BYTE *, FILE *),
  1199.      *truncname(BYTE *);
  1200.  
  1201. int  nextbyte(FILE *);
  1202.  
  1203. FILE *fopen_read(BYTE *), *fopen_write(BYTE *);
  1204.  
  1205. #if USE_MACROS
  1206. void calcchecksum(int);
  1207. #else
  1208. #include "chksum.h"
  1209. #endif USE_MACROS
  1210.  
  1211. #else !LATTICE  /* For compilers which don't know about prototypes. */
  1212.  
  1213. void asciiout(), exit(), intodiagnosislist(), outdiagnosislist(),
  1214.      printhelp(), producediagnosis(), wordout();
  1215.  
  1216. BYTE atob(), btoa(), copyfile(), decode_line(), new_decodefile(),
  1217.      old_decodefile(), performrepair(), producerepair(), readbuffer(),
  1218.      *truncname();
  1219.  
  1220. int  nextbyte();
  1221.  
  1222. FILE *fopen_read(), *fopen_write();
  1223.  
  1224. #if USE_MACROS
  1225. void calcchecksum();
  1226. #else
  1227. #include "chksum.h"
  1228. #endif USE_MACROS
  1229.  
  1230. #endif LATTICE
  1231. SHAR_EOF
  1232. cat << \SHAR_EOF > btoa.uu
  1233.  
  1234. begin 644 btoa
  1235. M```#\P`````````"``````````$``!"W```"TP```^D``!"W2.=^_DOO`#0D%
  1236. M2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
  1237. M`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
  1238. M20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
  1239. M(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
  1240. M0`!(+P`D0"`J`"1G$BQL!Y`@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZNS
  1241. M_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``"#1R5
  1242. M`"`\````QF`")L%1R/_\3KHP-'``8`0@+P`$+P`@+``L9P0@0$Z03KHB3"QX\
  1243. M``0B;`>03J[^8DJL!YAG"")L!YA.KOYB2JP'G&<((FP'G$ZN_F)*K`!89P@B&
  1244. M;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
  1245. M3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
  1246. MKOW8*4`'D&?:3G4``$Y5_^Y(YP\P.7PH``7H<``H`"($&4$(02X!+`<9?``!H
  1247. M"$"7RQM`__L;0/_Z2@9F``",#&T``0`(;P``@B)M``H@:0`$$!`,```M9G!2O
  1248. MB"1(2@9F7!H24HI*!6=4(`5(@'(>74%K1K![$`AF]D[[$`0`<F```#``;V``Q
  1249. M`"0`:&```!H`9&````P`86````)X`6"^&WP``?_[8+9\`6"R0BP(0&"L&WP``
  1250. M`?_Z8*1\`6"@6*T`"E-M``A@`/]R#&T``P`(;P)\`4H&9P9A``-J8#`,;0`!J
  1251. M``AO("!M``HF:``$+PM.NA):6$\K0/_N2H!F!'P!8`Q^`6`(0>P'$"M(_^Y*?
  1252. M!F8^#&T``@`(;RY*+?_[9BA*+?_Z9B(@;0`*+R@`"$ZZ$EA83RE`"*9*@&8$;
  1253. M?`%@$!E\``$(06`(0>P'*"E("*9*!F9&2BW_^V<.+RW_[DZZ$F183RP`8#)*'
  1254. M+?_Z9PXO+?_N3KH3S%A/+`!@'DH$9PXO+?_N3KH%Y%A/+`!@#"\++RW_[F$XT
  1255. M4$\L`$H'9PHO+?_N3KH6:EA/2BP(06<*+RP(IDZZ%EI83TH&9PIP`3\`3KH5K
  1256. M[%1/3-\,\$Y=3G5.5?_N2.<O,"9M``@D;0`,<``I0`@\*4`(."E`"#1*+`A`C
  1257. M9RZT_```9@9![`!\8`HO"F$`!3A83R!`+PAP3C\`2&P`:"\L"*9.NAF83^\`R
  1258. M#F`.2&P`?B\L"*9.NAF&4$]\`"\+<`0_`'(!/P%(;`A"3KH:/D_O``P[0/_NI
  1259. M#$``!&Q*2D!O#!(L"$)(@0)!`/]@`G(`*@$,0``!;PP2+`A#2($"00#_8`)R-
  1260. M`"@!#$```F\,$BP(1$B!`D$`_V`"<@!T`#M!__([0O_P8#02+`A"2($"00#_/
  1261. M*@$2+`A#2($"00#_*`$2+`A$2($"00#_%"P(14B"`D(`_SM!__([0O_P2D!OI
  1262. M``$T2BP(0&8``/8@!4C`L:P(-"`%(`520$C`T:P(.`@L``<(/&<0("P(/-"`,
  1263. M*4`(/%*L"#Q@"B`L"#S0@"E`"#P@!4C`T:P(/"`$2,"QK`@T(`0@!%)`2,#1,
  1264. MK`@X""P`!P@\9Q`@+`@\T(`I0`@\4JP(/&`*("P(/-"`*4`(/"`$2,#1K`@\5
  1265. M2,&SK`@T,"W_\B(`4D%(P=.L"#@(+``'"#QG$"(L"#S2@2E!"#Q2K`@\8`HB&
  1266. M+`@\TH$I00@\2,#1K`@\2,*UK`@T,"W_\"(`4D%(P=.L"#@(+``'"#QG$"(LN
  1267. M"#S2@2E!"#Q2K`@\8`HB+`@\TH$I00@\2,#1K`@\(`4B!>%!@D0N`4C'(`<B(
  1268. M!^&!,"W_\DC`@H#A@3`M__!(P(*`+@$O!V$``3)83S`M_^Y(P-R`#&T`!/_NQ
  1269. M9P#^(G#_/P!A``(F5$\O+`@\+RP(."\L"#0O!B\&2&P`C"\L"*9.NA=\3^\`^
  1270. M''``3-\,]$Y=3G5(;`#42&P`M$AL!T!.NA=>3^\`#$AL`-A(;`=`3KH73E!/J
  1271. M2&P!#DAL!T!.NA=`4$](;`%"2&P'0$ZZ%S)03TAL`4Y(;`=`3KH7)%!/2&P!S
  1272. M:DAL!T!.NA<64$](;`&*2&P'0$ZZ%PA03TAL`:A(;`=`3KH6^E!/2&P!UDAL'
  1273. M!T!.NA;L4$](;`'\2&P'0$ZZ%MY03TAL`@A(;`=`3KH6T%!/2&P"%$AL!T!.0
  1274. MNA;"4$](;`)&2&P'0$ZZ%K103TAL`GQ(;`=`3KH6IE!/2&P"LDAL!T!.NA:8"
  1275. M4$](;`+62&P'0$ZZ%HI03TYU3E7__$CG!P`N+0`(2H=F#G!Z/P!A``#Z5$]@S
  1276. M``#L2BP(0&<6#(<@("`@9@YP>3\`80``WE1/8```T'P`2H=J"'P@!(=CD)8@W
  1277. M2H=J"'Q`!(=CD)8@(`<B/`,<A+%.NC:4*@`@!4C`(CP#'(2Q3KHW2)Z`(`4@1
  1278. M!=!&!D``(3\`80``D%1/(`<B/``)7NU.NC9D*@`@!4C`(CP`"5[M3KHW&)Z`.
  1279. M(`4@!09``"$_`&%B5$\@!R(\```<.4ZZ-C@J`"`%2,`B/```'#E.NC;LGH`@8
  1280. M!2`%!D``(3\`83943R`'2,!R58'!*@`@!<'!2,">@"`%(`4&0``A/P!A%E1/#
  1281. M(`<&0``A/P!A"E1/3-\`X$Y=3G5.50``2.<!`#XM``@,1___9CQ*;`+X9P``D
  1282. MWDHL"$!G'"`L"#AR54ZZ-;H&@0```"$O+`BF/P%.NA5V7$\O+`BF<`H_`$ZZB
  1283. M%6A<3V```*HO+`BF/P=.NA587$]2;`+X2BP(0&=X(`=(P+&L"#0@!R`'4D!(F
  1284. MP-&L"#@(+``'"#QG$"`L"#S0@"E`"#Q2K`@\8`H@+`@\T(`I0`@\(`=(P-&LE
  1285. M"#P,;`!-`OAM3"`L"#AR54ZZ-3`&@0```"$O+`BF/P%.NA3L7$\O+`BF<`H_B
  1286. M`$ZZ%-Y<3W``.4`"^&`:#&P`3@+X;1(O+`BF<`H_`$ZZ%,!<3T)L`OA,WP"`=
  1287. M3EU.=4Y5__I(YP$P)FT`""1+'A-2BTH'9Q`,!P`O9P8,!P`Z9NPD2V#H(`I,%
  1288. MWPR`3EU.=4Y5_^!(YP,P)FT`"'X`+PM.NA8.6$\L`"\+2&P"_$AL"$).N@MX$
  1289. M3^\`#$H`9P)^`4H'9AAP!3\`2&P#!$AL"$).NB'^3^\`"DI`9L)*!V8``)A!I
  1290. M[`A"0^P#"B1)$!BP&F8$2@!F]F840BP(0$AL`QA(;`=`3KH3T%!/8&Q(;`BL9
  1291. M2&W_^$AL`S!(;`A"3KH=UD_O`!!50&9`&7P``0A`2BP(069$0>P(K$/L`T0D7
  1292. M21`8L!IF!$H`9O9G+DAL"*Q.N@M>6$\I0`BF2H!F!'X!8!@9?``!"$%@$$ALE
  1293. M`T9(;`=`3KH39%!/?@%*!V8Z<``I0`@\*4`(."E`"#1*+`A`9Q@_+?_X+P9(:
  1294. M;?_@+PMA``#P3^\`#BX`8`Y(;?_@+PMA``,"4$\N`$H'9@``DDAM_^1(;?_H]
  1295. M2&W_[$AM__!(;?_T2&P#9DAL"$).NAT:3^\`'%M`9Q@O+?_@2&P#CDAL!T!.#
  1296. MNA+D3^\`#'X!8%`B+?_TLJW_\&8>(BW_[+*L"#1F%"(M_^BRK`@X9@HB+?_D!
  1297. MLJP(/&<22&P#P$AL!T!.NA*H4$]^`6`6("W_]%.``H`````#/P!"IV$``PI<M
  1298. M3R`'3-\,P$Y=3G5.5?_Z2.<#$"9M``@O"TZZ%$I83RP`+PM.N@\X6$\N`$)G.
  1299. M+P8O"TZZ$YY/[P`*(`=,WPC`3EU.=4Y5_]Q(YR\0)FT`"'H`<`$K0/_T<``LD
  1300. M`$*M_^P;0/_X2@9F``'$*VT`$/_P+PM.NA/R6$]X`%*M__0O"TAL`^Y(;`A"S
  1301. M*T``$$ZZ"51/[P`,2@!G"'P!*`9@``"L$"P(0@P``'AF!GP!8```G$'L"$(BB
  1302. M2$H99OQ3B9/((`E30"X`,BT`%+)'9@PB2-+'$!$,```*9W+0QQ`0#```"F<FY
  1303. M>`$O"TZZ#G983SM`__P,0/__9P8,```*9N@,;?____QF+GP!8"J^;0`4;@XON
  1304. M"V$`_OI83PQ``'AG%G@!0>P(0=#'$!!(@`1``"%(P"E`"#A*!&<4+RW_]$AL<
  1305. M`_9(;`=`3KH12$_O``Q*!&8``*)*!F8``)P@!R`'4T`_`$AL"$)A``&D7$]*@
  1306. M`&<:2@5F%"\M__1(;`0:2&P'0$ZZ$0Y/[P`,>`%![`A!T,<0$$B`.T#__"`L'
  1307. M"#AR54ZZ,5X&@0```"$T+?_\M$%F($HM__AG/B\M`!`O+?_L2&W_W$ZZ!OA/(
  1308. M[P`,0BW_^&`D>`$O+?_T2&P$/$AL!T!.NA"P3^\`##`M__P$0``A2,`I0`@X<
  1309. M2@1G`/YP2@5F&$AL!%Y(;`=`3KH0B%!/D<@K2/_H*TC_Y'H!2BW_^&8`_DH;[
  1310. M?``!__@K;?_P_^Q@`/XZ2@5G)DHM__AG%"\M`!`O+?_L2&W_W$ZZ!G1/[P`,2
  1311. M+PM(;?_<3KH%8%!/(&T`#""M__0@!4S?"/1.74YU3E7_^$CG#Q`F;0`(>@!X>
  1312. M`7P`2@9F>E*$+PM(;`1Z2&P(0DZZ!U9/[P`,2@!G!GP!*@9@,A`L"$(,``!X<
  1313. M9@1\`6`D0>P(0B)(2AEF_%.)D\@@"5-`+@`B2-+'$!$,```*9P1\`2H&2@9FZ
  1314. MJ#\'2&P(0F$N7$]*`&>:+P1(;`2"2&P'0$ZZ#Z!/[P`,?`$J!F""(&T`#""$F
  1315. M(`5,WPCP3EU.=4Y5__A(YS\0)FT`"#XM``QZ`+;\``!F6!(L!*1*`6\`!'XO;
  1316. M+`BF/RP)%$ZZ#Y)<3TI';PXO+`BF/RP)%DZZ#X!<3PQ'``%O#B\L"*8_+`D8_
  1317. M3KH/;%Q/#$<``F\`!$(O+`BF/RP)&DZZ#U9<3V``!#!*1V\`!"I31QP32(922
  1318. MBPPL``4$I&8^+RP(IC\L"11.N@\N7$\O+`BF/RP)%DZZ#R!<3R\L"*8_+`D8?
  1319. M3KH/$EQ/+RP(IC\L"1I.N@\$7$]P`!E`!*1*+`A`9SX@!DC`L:P(-"`&(`92J
  1320. M0$C`T:P(.`@L``<(/&<0("P(/-"`*4`(/%*L"#Q@"B`L"#S0@"E`"#P@!DC`O
  1321. MT:P(/"`&#```(6T``DP,``!V;``"1!(L!*1(@70$)@*60;Y#;0``M!(L!*1(Y
  1322. M@91!GD)*+`2D9A`B!B(`!$$`(4C!*4$)$&`:("P)$')53KHO8B(&(@8$00`A[
  1323. M2,'0@2E`"1!2+`2D#"P`!02D;```IAP32(92BTHL"$!G/B`&2,"QK`@T(`8@#
  1324. M!E)`2,#1K`@X""P`!P@\9Q`@+`@\T(`I0`@\4JP(/&`*("P(/-"`*4`(/"`&_
  1325. M2,#1K`@\("P)$')53KHN\"(&(@8$00`A2,'0@2E`"1!2+`2D8(Q*+`2D9A8@Y
  1326. M!B`&!$``(4C`<@$I0`D0&4$$I&`>("P)$')53KHNM"(&(@8$00`A2,'0@5(LR
  1327. M!*0I0`D0$BP$I`P!``5F`/Y.*"P)$"`$)``"0@#_X(0@!"8``D,`_^"$(`0BH
  1328. M``)!`/\Y0@D:)`3@@@)"`/\Y00D6.4()%#E#"1A*+`A`9@#^#DC"M:P(-#`LN
  1329. M"10D`%)"2,+5K`@X""P`!P@\9Q`D+`@\U((I0@@\4JP(/&`*)"P(/-2"*4((X
  1330. M/$C`T:P(/$C!LZP(-#`L"18B`%)!2,'3K`@X""P`!P@\9Q`B+`@\TH$I00@\J
  1331. M4JP(/&`*(BP(/-*!*4$(/$C`T:P(/$C#MZP(-#`L"1@B`%)!2,'3K`@X""P`@
  1332. M!P@\9Q`B+`@\TH$I00@\4JP(/&`*(BP(/-*!*4$(/$C`T:P(/#`L"1I(P+&L!
  1333. M"#0P+`D:(@!204C!TZP(.`@L``<(/&<0(BP(/-*!*4$(/%*L"#Q@"B(L"#S21
  1334. M@2E!"#Q(P-&L"#Q@`/T6(`8,``!Z9Q!*+`A`9P`!+@P``'EF``$F2BP$I&<&_
  1335. M>@%@`/SR#$8`>F8$<@!@`G(@.4$)%#E!"18Y00D8.4$)&DHL"$!F``#L2,&S9
  1336. MK`@T,BP)%"0!4D)(PM6L"#@(+``'"#QG$"0L"#S4@BE""#Q2K`@\8`HD+`@\V
  1337. MU((I0@@\2,'3K`@\LZP(-#(L"10D`5)"2,+5K`@X""P`!P@\9Q`D+`@\U((IT
  1338. M0@@\4JP(/&`*)"P(/-2"*4((/$C!TZP(/+.L"#0R+`D4)`%20DC"U:P(.`@LE
  1339. M``<(/&<0)"P(/-2"*4((/%*L"#Q@"B0L"#S4@BE""#Q(P=.L"#RSK`@T,BP)N
  1340. M%"0!4D)(PM6L"#@(+``'"#QG$"0L"#S4@BE""#Q2K`@\8`HD+`@\U((I0@@\L
  1341. M2,'3K`@\&7P`!02D8`#[VGH!8`#[U"`%3-\(_$Y=3G4``$Y5__!(YP$P)FT`T
  1342. M""1M``PO"DZZ#*!83RX`+RP$LF$``I)83RM`__Q*@&<``,0O+`2R2&P$\$AL<
  1343. M!T!.N@J>3^\`#"\M__PO+`3>3KH+*%!/2&W_]$AM__@O"V$``19/[P`,(BW_-
  1344. M^`R!_____V=>0F<O`2\*3KH+JD_O``HO"G!D/P!(;`A"3KH'B$_O``HO+?_\=
  1345. M2&P(0DZZ"MQ03T)G+RW_]"\*3KH+>D_O``HO"G!D/P!(;`A"3KH'6$_O``HOY
  1346. M+?_\2&P(0DZZ"JQ03PRM_______X9@#_>B\M__PO+`3>3KH*DE!/+RW__$ZZ$
  1347. M!DQ83T)G+P<O"DZZ"RA/[P`*3-\,@$Y=3G5.5?_X2.<#,"9M``@N+0`,+"T`0
  1348. M$'`0/P!.N@V<5$\D0"2')48`!)'()4@`"")K``PK2?_XLOP``&8,($HG2``,X
  1349. M)T@`"&`>(BD`!+*';0XC1@`$+PI.N@W$6$]@""-*``@G2@`,3-\,P$Y=3G5.K
  1350. M5?_\2.<`,"9M``@D:P`(M/P``&80</\@;0`0((`@;0`,((!@)B!M``P@DB!M*
  1351. M`!`@J@`$)VH`"``(+PI.N@UP6$]*JP`(9@1"JP`,3-\,`$Y=3G5.5?_^2.<#[
  1352. M,B9M``@D;0`,?``N!DH'9DA*!F9$+PM(;`422&P)'&%"3^\`#$H`9P1\`6#@0
  1353. MM/P``&<,+PI(;`D<3KH);%!/0>P)'")M`!`L21`8L!YF!$H`9O9FN'X!8+0@.
  1354. M!DS?3,!.74YU3E7__DCG`3`F;0`()&T`#'X`+RT`$'!D/P`O"TZZ!<)/[P`*Q
  1355. M2H!F%"\*2&P%&DAL!T!.N@AV3^\`#'X!(`=,WPR`3EU.=4Y5__Q(YP`P)FT`V
  1356. M"$AL!3PO"TZZ!@I03R1`M/P``&82+PM(;`4^2&P'0$ZZ"#A/[P`,(`I,WPP`9
  1357. M3EU.=4Y5__Q(YP`P)FT`"$AL!6`O"TZZ!<Y03R1`M/P``&82+PM(;`5B2&P'O
  1358. M0$ZZ!_Q/[P`,(`I,WPP`3EU.=4Y5__9(YP,R)FT`"'X`E<HK2O_X+RP$P$AL7
  1359. M!91(;`=`3KH'RD_O``PO+`2R80#_6EA/*T#_^$J`9@1^`6!B+RP$P&&`6$\D+
  1360. M0+3\``!F$B\M__A.N@/V6$]"K?_X?@%@0"\M__@O+`602&P(0F$`_M1/[P`,F
  1361. M2@!G`GX!2@=F%D'L"$(B;`3>+$D0&+`>9@1*`&;V9LPO"B\L!.Q.N@?J4$]\K
  1362. M`$H'9@``GDH&9@``F"\M__@O+`602&P(0F$`_H9/[P`,2@!G!'X!8-A![`A"V
  1363. M(FP$WBQ)$!BP'F8$2@!F]F8$?`%@ODAL"$)"IR\+80#]ZD_O``PN`$H'9J@O?
  1364. M"DAL"$).N@>$4$\O+?_X+RP%D$AL"$)A`/XN3^\`#$H`9P1^`6"`+PI(;`A"=
  1365. M3KH'7%!/2&P(0B\*+PMA`/V@3^\`#"X`8`#_8$H'9@PO"B\L!.Q.N@<V4$^T/
  1366. M_```9P@O"DZZ`NQ83TJM__AG"B\M__A.N@+<6$\@!TS?3,!.74YU3E7_]DCG3
  1367. M`S(F;0`(?@"1R"1(+RP$P"M(__AA`/WP6$\D0+3\``!F!'X!8&8O+`3.80#^@
  1368. M%EA/*T#_^$J`9@XO"DZZ`HQ83Y7*?@%@1B\L!,Y(;`6^2&P'0$ZZ!A9/[P`,D
  1369. M+PHO+`6Z2&P(0F$`_5I/[P`,2@!G`GX!2@=F%D'L"$(B;`3L+$D0&+`>9@1*F
  1370. M`&;V9LY\`$H'9@``EDH&9@``D"\*+RP%NDAL"$)A`/T:3^\`#$H`9P1^`6#:@
  1371. M0>P(0B)L!.PL21`8L!YF!$H`9O9F!'P!8,!(;`A"+RW_^"\+80#\?$_O``PN3
  1372. M`$H'9J@O"B\L!;I(;`A"80#\SD_O``Q*`&<$?@%@CDAL"$(O+?_X+PIA`/Q*X
  1373. M3^\`#"X`2&P(0D*G+PMA`/PX3^\`#&``_VA*!V8F+PMP9#\`2&P(0DZZ`FA/H
  1374. M[P`*2H!G$"\M__A(;`A"3KH%N%!/8-I*K?_X9PHO+?_X3KH!:EA/M/P``&<(4
  1375. M+PI.N@%<6$\@!TS?3,!.74YU``!(YS`R+'D```>4(&\`&")O`!PD;P`@)F\`^
  1376. M)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU3E7__DCG(`!P`#E``!A*;0`(W
  1377. M:R8R+0`(LFP'C&P<(`%T!L'"0>P*7")(TL!*46<*(`'!PM#`(`A@"#E\``D&R
  1378. M\'``3-\`!$Y=3G4`````$V0``!-4```3-```$R0`@?LH````.$Y5__H_+0`(%
  1379. M3KK_DE1/*T#_^DJ`9@1P_V`V(&W_^@@H``(``6<&<``P@&`D0FW__B\H``).V
  1380. MNB?>6$]*;``89P9P_SM`__X@;?_Z0E`P+?_^3EU.=4Y5__A(YP`@1>P'$+3\)
  1381. M``!G-`@J``(`$V8H""H``0`39R`@*@`$D*H`##M`__Q*0&<0/P`O*@`,/RH`5
  1382. M%$ZZ$FY03R128,8_+0`(3KHE-%1/3-\$`$Y=3G4```!``(%P84Y5__@@;0`(M
  1383. M""@``0`39Q(O"'#_/P!.NA0X7$\[0/_^8`9P`#M`__X@;0`(,"@`$@)```Q*^
  1384. M0&842F@`$&<./R@`$"\H``Q.N@Q07$\@;0`(/R@`%$ZZ_O943SM`__P,;?__V
  1385. M__YG!$I`9P1P_V`"<`!.74YU3E4``"!M``@(*``&`!-G)B\(</\_`$ZZ$\1<Z
  1386. M3T'L!Q`B;0`(L\AF#DAL!RAP_S\`3KH3JEQ/(&T`"%-H``@P*``(2D!K$")HA
  1387. M``12J``$$!$"0`#_8`@O"$ZZ$>)83TY=3G4``$Y5__Q(YR``0FW__C`M``Q3H
  1388. M0#0M__ZT0&Q*(&T`#E-H``@P*``(2D!K$")H``12J``$$!$"0`#_8`@O"$ZZ@
  1389. M$9I83SM`__P,0/__9Q@R+?_^4FW__B!M``@1@!``#$``"F:J3G$@;0`(,"W_U
  1390. M_D(P``!*0&8$<`!@`B`(3-\`!$Y=3G4``$Y5__A![`<0*TC__$JM__QG&B!M'
  1391. M__Q*:``29Q`K;?_\__@@;?_\*U#__&#@2JW__&8L<!@_`$ZZ!'Q43RM`__Q*D
  1392. M@&8$<`!@*"!M__@@K?_\<!=R`"!M__P0P5'(__PO+?_\+RT`#"\M``AA"$_O>
  1393. M``Q.74YU3E7_]"!M`!!*:``29P@O"$ZZ_AY83SML!PS_^BMM``S_]B!M__80`
  1394. M*``!`D``_PQ``&)G#`Q``&%F$$)M__I@!CM\@`#_^E*M__8@;?_V#"@`*P`!"
  1395. M5\!$`$B`(&T`#!(0`D$`_QM`__4,00!W9P``C@Q!`')G1`Q!`&%F``#(<`P_I
  1396. M`#(\@0(_`2\M``A.N@?^4$\[0/_\4D!F!G``8```Y$HM__5G!C`\`(!@`G`"!
  1397. M`$!``#M`__Y@``"02BW_]6<$<`)@`G```$"``'(,/P$_`"\M``A.N@>V4$\["
  1398. M0/_\4D!F!G``8```G$HM__5G!C`\`(!@`G`!.T#__F!,2BW_]6<$<`)@`G`![
  1399. M`$"```!``0``0`(`<@P_`3\`+RT`"$ZZ!VQ03SM`__Q20&8$<`!@4DHM__5GD
  1400. M!C`\`(!@`G`".T#__F`$<`!@.I'((FT`$"-(``QP`#-``!`S;?_\`!0C:0`,5
  1401. M``0S0``*,T``"$IM__IF!#`\@``R+?_^@D`S00`2(`E.74YU``!@0"\M__AP@
  1402. M84Y5``!2;`F$(&P)@%-H``HP*``*2D!K%")H``12J``$,"T`"!*``D``_V`2*
  1403. M,"T`"`)``/\O"#\`3KH0MEQ/3EU.=4Y5``!";`F$*6T`"`F`2&T`$"\M``Q(]
  1404. M>O^F3KH:<D_O``PO+0`(</\_`$ZZ$()<3S`L"81.74YU``!.50``(&T`"@@H5
  1405. M``8`$V<6,BT`"`Q!``IF#"\(/P%.NA!47$]@-B!M``I3:``*,"@`"DI`:Q0B3
  1406. M:``$4J@`!#`M``@2@`)``/]@$C`M``@"0`#_+P@_`$ZZ$!Q<3TY=3G5.5?_^=
  1407. M(&T`"!`0`D``_U*M``@[0/_^2D!G%"\M``P_`$ZZ_WY<3U)`9MIP_V`"<`!.R
  1408. M74YU3E7_^DCG#R`D;0`(/BT`##PM``Y*1V8$<`!@5'H`ND9L3'@`N$=L0B!MD
  1409. M`!!3:``(,"@`"$I`:Q`B:``$4J@`!!`1`D``_V`(+PA.N@WT6$\[0/_Z#$#_T
  1410. M_V8$(`5@$C`M__H4@%**4D1@NE)%8+`@!4S?!/!.74YU3E4``"!M``@(*``!X
  1411. M`!-G#B\(</\_`$ZZ#U!<3V`H,BT`$`Q!``%F'@@H``<`$F<,,"@`"$C`T:T`J
  1412. M#&`*,"@`"$C`D:T`#"!M``@A:``,``1P`#%```HQ0``(""@`!P`39P8":/_\6
  1413. M`!(_+0`0+RT`##\H`!1.N@'>4$]2@&8$</]@#"!M``@":/_/`!)P`$Y=3G4`+
  1414. M`$Y5__P@;0`(""@``0`39Q9*:``09@1P`&!V+PAP_S\`3KH.LEQ/<`$_`$*G7
  1415. M(&T`"#\H`!1.N@&*4$\K0/_\#(#_____9TH@;0`(2F@`$&=`(&T`"`@H``$`E
  1416. M$V<0("@`!)"H``PB+?_\T(%@)`@H``<`$F<.,"@`"$C`(BW__-"!8`XP*``((
  1417. M2,`B+?_\DH`@`4Y=3G5.50``<``P+0`(+P!A!EA/3EU.=4Y5_^A(YP,@+BT`-
  1418. M"$J';@9P`&```-`,AP````AL`GX((`<@!U:`Y(#E@"X`0>P'@B10*TC_^+3\;
  1419. M``!G3B(J``2RAVT^LH=F$B!2(FW_^"*(GZP'AB`*8```C"`J``20APR`````;
  1420. M"&T:($H@2M''()(A0``$(FW_^"*(GZP'AB`*8&(K2O_X)%)@K#`L!Z!(P"('H
  1421. M(@?2@%.!+T``#"`!(B\`#$ZZ'4@B+P`,3KH>!%"`+``@!B`&5H#D@.6`+``O^
  1422. M!DZZ`;Y83RM`__!*@&<4+P8O`$ZZ!;Q03R\'80#_)%A/8`)P`$S?!,!.74YUO
  1423. M``$`#`""H@`````H3E4``#(M``@,00`P;0H,00`Y;@1P`6`"<`!.74YU``!..
  1424. M5?_V/RT`"$ZZ]Z)43RM`__9*@&8$</]@*C\M``XO+0`*(&W_]B\H``).NA\0!
  1425. M3^\`"BM`__I*;``89P1P_V`$("W_^DY=3G5.5?_X2JP)B&<<*VP)B/_X(&W_[
  1426. M^#\0+RP)B$ZZ!/A<3Y'(*4@)B$IM``AF!'``8#!4;0`(/RT`"$ZZ_E)43RM`)
  1427. M__Q*@&8$<`!@%BMM__S_^"!M__@PK0`((&W__%2((`A.74YU3E4``$JM``AG+
  1428. M$$)G88Y43R!M``A5B"E("8AP`$Y=3G5.5?_V2.<P`$IM``QF#"\M``AAS%A/!
  1429. M2,!@>$JM``AF##\M``QA`/]65$]@9B!M``A5B#`054`[0/_V*TC__+'L"8AGB
  1430. M"$)G80#_-%1//RT`#&$`_RI43RM`__A*@&<P-"T`##8M__:V0F,$.T+_]C`M#
  1431. M__8B`"!M``@B;?_X8`(2V%')__PO+0`(80#_5EA/("W_^$S?``Q.74YU``!.+
  1432. M5?_X("T`"`:`````"B]````@+P``<@`L>``$3J[_.BM`__Q*K?_\9@1P`&`T$
  1433. M("T`"`:`````"B!M__PQ0``(+PA(;`F,80`!$%!/2JP'>&8&*6W__`=X(&W_T
  1434. M_-#\``H@"$Y=3G5.5?_\<``P+0`(+P!AC%A/*T#__$J`9@1P_TC`3EU.=4Y5`
  1435. M__A(YP$@80``@'``*4``$"E```@I0``,*4`'@BE`!X8I0`=\*4`'>$)L!X!*R
  1436. MK`=P9TP@+`>@(BP'<-*`4X$@`2(L!Z!.NAJ>(BP'H$ZZ&UI0@"X`(`<@!U:`>
  1437. MY(#E@"X`+P=A`/\46$\D0+3\``!F!'#_8`PO!R\*3KH"\E!/<`!,WP2`3EU.#
  1438. M=4Y5__0K;`F,__Q*K?_\9RH@;?_\*U#_^'``,"@`""]````B;?_\("\``"QXK
  1439. M``1.KO\N*VW_^/_\8-"1R"E("9`I2`F,3EU.=4Y5``!(YP`@(FT`""!I``0BV
  1440. M;0`,(T@`!)'((H@D;0`(2I)F`B2)2JH`!&<&(&H`!""))4D`!$S?!`!.74YU@
  1441. M```[0/_\4D!F!'``8%)*+?_U9P8P/`"`8`)P`CM`__YP84Y5_^Y(YR``0BW_"
  1442. M_T)L`!@[;`;P__@[?``#__HR+?_ZLFP'C&P6(`'!_``&0>P*7-#`2E!G!E)MD
  1443. M__I@X#(M__HT+`>,M$%F##E\`!@&\'#_8``!8B`!P?P`!D'L"ES0P"M(_^Y*1
  1444. M;0`.9P@(+0`"``]G!D)M__9@!CM\``'_]C`L!U@"0(``L6T`#`@M``,`#6<0W
  1445. M,"T`#`)`__P`0``".T``##`M``P"0``##$```F<*#$```6<$2D!F##`M``Q2+
  1446. M0#M`__Q@##E\`!8&\'#_8```Y#`M``PB``)!`P!*06<``*0(```*9QH;?``!H
  1447. M__\_+?_V+RT`"$ZZ'*A<3RM`__)@2@@```EF'C`\`^T_`"\M``A.NAN87$\KE
  1448. M0/_R2H!J!@CM``$`#`@M``$`#&<>&WP``?__.6W_^`;P/RW_]B\M``A.NAO@E
  1449. M7$\K0/_R2BW__V=&,"T`#`)``/!*0&<Z2JW_\FLT+RW_\DZZ&YI83S`\`^T_"
  1450. M`"\M``A.NALR7$\K0/_R8!0P/`/M/P`O+0`(3KH;'%Q/*T#_\DIL`!AG!'#_A
  1451. M8!(@;?_N,*W__"%M__(``C`M__I,WP`$3EU.=4Y5```P+0`,(@`"08```$$#M
  1452. M`0)`?_\_`#\!+RT`"&$`_B103TY=3G5F!#`\@`!P84Y5__@_+0`(3KKREE1/<
  1453. M*T#__$J`9@1P_V`J/RT`#B\M``H@;?_\+R@``DZZ&4Q/[P`**T#_^$IL`!AG@
  1454. M!'#_8`0@+?_X3EU.=0`(2F@`@7!A3E7__'``,"T`#"\`+RT`""M`__QA!E!/+
  1455. M3EU.=4Y5_^A(YR$P+BT`#$J';@9P_V```/`,AP````AL`GX((`<@!U:`Y(#E?
  1456. M@"X`(&T`""M(__31Q]^L!X9#[`>")%$K2/_P*TG_^+3\``!G``"B($H@*@`$$
  1457. M($K1P"M(_^PD+?_PM<)C%B)M__0BBB-'``0F;?_X)HEP`&```(JUPF8>(E(F-
  1458. M;?_T)HD@*@`$(@#2AR=!``0B;?_X(HMP`&!F(FW_]+/(9`B?K`>&</]@5K/(.
  1459. M9BY*DF<.(A*T@6,(GZP'AG#_8$#?J@`$2I)G$+229@P@0B`H``31J@`$))!P)
  1460. M`&`D*TK_^"MM_^S_Z"128`#_6B!M__@@K?_T(&W_]$*0(4<`!'``3-\,A$Y=A
  1461. M3G5.5?_N2.<P`"EM``@)F$'M`!!";?_^*TC_\B!M``Q*$&<``200$`)``/]2Q
  1462. MK0`,0>P%[=#`$A`[0/_\"`$``V;:#$``)68``,0@;0`,#!``)68R(&P)F!`0F
  1463. M`D``_U*L"9@[0/_\0>P%[=#M__P0$`@```-FW@QM`"7__&>>,"W__F```,@@<
  1464. M;0`,#!``*F<,*VW_\O_N6*W_\F`*D\E2K0`,*TG_[D)M__HO+?_N2&W_^DAZQ
  1465. M`*`O+0`,3KH06D_O`!`K0/_V2H!6P40!2(%*06<$*T``##8M__H,0___9AA*U
  1466. M06<$4FW__DIM__YO!C`M__Y@6'#_8%1*0V<$4ZP)F$JM__9F.C`M__Y@0"!LP
  1467. M"9@0$`)``/\[0/_Z4JP)F$'L!>W0[?_Z$!`(```#9MXR+?_ZLFW__&<`_N0P$
  1468. M+?_^8`Q2;?_^8`#^UC`M__Y,WP`,3EU.=4Y5__X@;`F8$!`"0`#_4JP)F#M`-
  1469. M__Y*0&8"</].74YU```O+0`(3KIP84Y5__A(YR``<``[0/_^.T#__#M`__@@B
  1470. M;0`($A`,`0`M9@QP`3M`__P[0/_X8`P,`0`K9@8[?``!__P@;0`(,BW__!`P.
  1471. M$``"0`#_/P!.NO>25$]*0&<H,"W__L'\``HR+?_\4FW__"!M``@4,!```D(`_
  1472. M_]!"!$``,#M`__Y@O$IM__AG!$1M__X@;0`,,*W__C`M__Q,WP`$3EU.=4Y5K
  1473. M__1(YP`@0BW__3M\``C__E-M__X@+0`,(@`"@0````]![`;TT,$R+?_^&Y`0"
  1474. M]>B`*T``#`*`#____RM```Q*K0`,9LQ![?_UT.W__B)()&T`"!399OQP")!MQ
  1475. M__Y,WP0`3EU.=4Y5```P+0`,2,`O`"\M``AAB%!/3EU.=0``3E7_\DCG("`[U
  1476. M?``+__)"+?__4VW_\B`M``PB``*!````!P:!````,#0M__(;@2#TYH`K0``,Q
  1477. M`H`?____*T``#$JM``QFS$'M__30[?_R(D@D;0`(%-EF_'`+D&W_\DS?!`1.5
  1478. M74YU3E4``#`M``Q(P"\`+RT`"&&(4$].74YU``!.5?_R2.<`(#M\``O_\D(M"
  1479. M__]3;?_R("T`#'(*3KH33`:!````,#`M__(;@0#T("T`#'(*3KH3-"M```Q*E
  1480. MK0`,9M!![?_TT.W_\B)()&T`"!399OQP"Y!M__),WP0`3EU.=0``3E7_^DCGA
  1481. M`0`@;0`,2AAF_%.(D>T`#"X((&T`"$H89OQ3B)'M``@@"")M``C2P"M)__HRC
  1482. M+0`0OD%C`BX!(`<@;0`,8`(2V%'(__P@;?_Z0C!P`"`M``A,WP"`3EU.=0``&
  1483. M3E7__DIM`!!G-"!M``A*$&<L(FT`#$H19R00$`)``/]2K0`($A$"00#_4JT`1
  1484. M#)!!.T#__DI`9B93;0`08,9*;0`09Q@@;0`(2A!G!'`!8`X@;0`,2A!G!'#_M
  1485. M8`)P`$Y=3G4``$Y5__PK;0`(__P@;?_\2A!G&A`0`D``_S\`3KH`&%1/(&W_+
  1486. M_!"`4JW__&#>("T`"$Y=3G4P+P`$#```86T*#```>FX$!```($YU``!.5?_Z)
  1487. M/RT`"$ZZ[))43RM`__I*@&8$</]@1B!M__H(*``#``%G$'`"/P!"IS\M``A.7
  1488. MNO2^4$\_+0`.+RT`"B!M__HO*``"3KH3B$_O``H[0/_^2FP`&&<$</]@!#`M6
  1489. M__Y.74YU3E7_^DCG("`D;0`(,"H`$B(``D&``%;"1`)(@B(``D$`,!M"__]*"
  1490. M06<*0FH`"'#_8``!9`@J``<`$V<4""H`!@`39PPO"G#_/P!.N@%47$]*:@`02
  1491. M9CA":@`(""H``@`39Q0U?``!`!`@2M#\`!8E2``,8```@B\*3KH#^EA/2D!G3
  1492. M=`CJ``4`$W#_8``!"DHM__]G8E1J``AN7"!J``12J@`$$!`"0`#_.T#__`Q`7
  1493. M`!IG,`Q```UF-E-J``@P*@`(2D!K$B!J``12J@`$$!`"0`#_8```PB\*80#_^
  1494. M)EA/8```M@CJ``0`$W#_8```JC`M__Q@``"B""H``0`39E`(Z@```!,_*@`0Y
  1495. M+RH`##\J`!1.NOB&4$\[0/_Z2D!J!@CJ``4`$TI`9@8(Z@`$`!-*0&\<2BW_)
  1496. M_V<*(@!$035!``A@!#5```@@:@`,)4@`!#`J`!("0``R2D!G&$HM__]G"'#_Y
  1497. M-4``"&`&<``U0``(</]@)%-J``@P*@`(2D!K$"!J``12J@`$$!`"0`#_8`@OU
  1498. M"F$`_FY83TS?!`1.74YU``!.5?_R2.<@("1M``HP+0`(,BH`$B0!`D(`,3M`E
  1499. M__A*0F<&</]@``*F(`$"0(``5L)$`DB"&T+__DIJ`!!F``","`$``F8``(1PG
  1500. M`#5```H,;?__``AG``)V+PI.N@)X6$]*0&<,".H`!0`3</]@``)>".H``0`3[
  1501. M2BW__F<.,"H`$"(`1$$U00`*8`@P*@`0-4``"E-J``HP*@`*2D!K%B!J``12A
  1502. MJ@`$,"T`"!"``D``_V```AHP+0`(`D``_R\*/P!A`/\^7$]@``($""H``@`3T
  1503. M9V`R+0`(#$'__V8&<`!@``'L&T'__THM__YG(@Q!``IF''`"/P!(;`<(/RH`O
  1504. M%#M`__9.NOSX4$\[0/_Z8!IP`3\`2&W__S\J`!0[0/_V3KK\W%!/.T#_^G#__
  1505. M.T``"&```/`(Z@`!`!-*+?_^9U(R+0`(#$'__V=(5&H`"@Q!``IF(B!J``12N
  1506. MJ@`$$+P`#4IJ``IK#"\*</\_`&$`_I1<3U)J``H@:@`$4JH`!#`M``@0@$IJ^
  1507. M``IK``%$.WS__P`(("H`!)"J``P[0/_V2D!G>@@J``8`$F=:<`(_`$*G/RH`T
  1508. M%$ZZ\3A03TC`*T#_\DHM__YG/E.M__(@+?_R2H!K,D)G+P`_*@`43KKQ$E!/V
  1509. M<`$_`$AM__T_*@`43KKV#%!/2FP`&&8,$"W__0P``!IGQ$YQ/RW_]B\J``P_5
  1510. M*@`43KK[[%!/.T#_^F`&<``[0/_Z,BW_^@Q!__]F"`CJ``4`$V`,LFW_]F<&2
  1511. M".H`!``32BW__F<.,"H`$"(`1$$U00`*8!@(*@`"`!-G"'``-4``"F`(,"H`B
  1512. M$#5```H@:@`,)4@`!#(M``@,0?__9S!3:@`*,"H`"DI`:Q`@:@`$4JH`!!"!N
  1513. M`D$`_V`4,"T`"`)``/\O"C\`80#]6EQ/(@`P*@`2`D``,$I`9P1P_V`0,BW_I
  1514. M^`Q!__]F!'``8`(@`4S?!`1.74YU3E4``"!M``A*:``09PP(*``#`!-F!'``.
  1515. M8#H_+`7H3KKNS%1/(&T`""%```0A0``,2H!F"CE\``P&\'#_8!8Q;`7H`!`"P
  1516. M:/_S`!)P`#%```HQ0``(3EU.=7#_8`0P+7!A3E7_\DCG`3`D;0`(#&P`(`F<)
  1517. M;```D!(2#`$`(&<,#`$`"6<&#`$`"F8$4HI@Z$H29W(P+`F<Y4!2;`F<0>P)<
  1518. MHM#`*TC__`P2`")F*%**((I*$F<*#!(`(F<$4HI@\DH29@QP`3\`3KH--%1/$
  1519. M8)Y"$E**8)@@;?_\((I*$F<8$A(,`0`@9Q`,`0`)9PH,`0`*9P12BF#D2A)FF
  1520. M`F`(0A)2BF``_VI*;`F<9@8@;`!(8`1![`FB*4@)GDIL"9QF``"&0>P'7")(3
  1521. M1^P*(B;9)MDFV2;9-I$F;`!((FL`)'`H/P`O*0`$2&P*(DZZ^,Y/[P`*0>P*-
  1522. M(B(()#P```/N+&P'D$ZN_^(I0`I>("P*7BE`"F1R!#E!"F(I0`IJ.4$*:.6`/
  1523. M*T#_\I/)+'@`!$ZN_MHK0/_V(&W_\B)M__8C:``(`*1^`&`R+&P'D$ZN_\HIZ
  1524. M0`I>+&P'D$ZN_\0I0`ID0>P';B(()#P```/M+&P'D$ZN_^(I0`IJ?@0@!R`'"
  1525. M`$"``8%L"EP@!R`'`$"``H%L"F(`;(`#"FA*;`<,9P1P`&`$,#R``"X`0FP'U
  1526. M)"`'(`<`0``!.4`'(CE\``$'/"`'(`<`0``".4`'.CE\``('5"`'(`<`0`"`X
  1527. M.4`'4D'Z#Q(I2``P+RP)GC\L"9Q.NLZ27$]"9TZZYBI43TS?#(!.74YU``!.+
  1528. M<3\M__8O*@`,/RH`%$ZZ^^QP84Y5_]!(YR`@<``;?``@__MR`#M!__@[?/__0
  1529. M__9![?_8&T#_]1M`__P;0/_]&T#__AM`__\[0?_L.T'_[BM(_]0@;0`(2A!G3
  1530. M5!`0`D``_W(874%K2+![$`AF]D[[$`0`(V```"P`(&```!X`*V```!``+6``!
  1531. M``(;?``!__]@&!M\``'__F`0&WP``?_]8`@;?``!__Q.<5*M``A@I"!M``@25
  1532. M$`P!`#!F"AM\`##_^U*M``@@;0`(#!``*F82(FT`#"!15)$[4/_X4JT`"&`6(
  1533. M2&W_^"\(3KKTSE!/(&T`"-#`*T@`""!M``@2$`P!`"YF-E*M``@@;0`(#!``R
  1534. M*F82(FT`#"!15)$[4/_V4JT`"&`62&W_]B\(3KKTC%!/(&T`"-#`*T@`""!M%
  1535. M``@2$`P!`&QF#!M\``'_]5*M``A@"@P!`&AF!%*M``@@;0`($!!2K0`(&T#_.
  1536. M]`)``/]R,%U!:P`"?+![$`AF]$[[$`0`8V```E(`<V```@H`6&```98`>&``U
  1537. M`9``<&```7@`;V```20`=6```/@`9&````)*+?_U9PPB;0`,(%%8D2`08`PBR
  1538. M;0`,(%%4D3`02,`K0/_P2H!J"G(!1*W_\#M!_^Y*;?_N9P1P+6`,2BW__F<$B
  1539. M<"M@`G`@&T#_V!`M__X"0`#_,BW_[H)`$"W__0)``/^"0$I!9PA2K?_44FW_.
  1540. M["\M__`O+?_43KKU+%!/.T#_TDIM__9J!G`!.T#_]C`M_](R+?_VDD`[0?_06
  1541. M2D%O-"!M_]0B2-+!(@`D2&`"$MI1R?_\$"W_^P)``/\R+?_0(&W_U&`"$,!1%
  1542. MR?_\,"W_]CM`_]+1;?_L0>W_V"M(_]1*+?__9P`!8AM\`"#_^V```5A*+?_UJ
  1543. M9PPB;0`,(%%8D2`08`PB;0`,(%%4D7``,!`K0/_P8`#_6DHM__5G#")M``P@1
  1544. M45B1(!!@#")M``P@4521<``P$"M`__!*+?_\9Q(@;?_4$+P`,%*M_]0[?``!B
  1545. M_^PO`"\M_]1.NO/,4$\[0/_28`#_'AM\`##_^TIM__9J!CM\``C_]DHM__5G;
  1546. M#")M``P@45B1(!!@#")M``P@4521<``P$"M`__!*+?_\9QX@;?_4$+P`,%*MJ
  1547. M_]0@;?_4$+P`>%*M_]0[?``"_^PO`"\M_]1.NO+@4$\[0/_2#"T`6/_T9@#^X
  1548. MK$AM_]A.NO3P6$]@`/Z>(FT`#"!16)$B4"M)_]2R_```9@A![`=T*TC_U"!M,
  1549. M_]1*&&;\4XB1[?_4.TC_[$IM__9K+C(M__:PP6\F.T'_[&`@.WP``?_L(FT`I
  1550. M#"!15)$P$!M`_]A"+?_98`9P`&```+`R+?_L-"W_^+1!;`AP`#M`__A@!)-M2
  1551. M__A*+?__9T93;?_L,"W_[$I`:QH@;?_4$!`"0`#_4JW_U#\`(&T`$$Z05$]@K
  1552. MVE-M__@P+?_X2D!K6A`M__L"0`#_/P`@;0`03I!43V#@4VW_^#`M__A*0&L4=
  1553. M$"W_^P)``/\_`"!M`!!.D%1/8.!3;?_L,"W_[$I`:QH@;?_4$!`"0`#_4JW_6
  1554. MU#\`(&T`$$Z05$]@VB`M``A,WP0$3EU.=4Y5__8K;0`0__8@;0`,$!!2K0`,:
  1555. M&T#__TH`9WH,```E9C`@;0`,#!``)68&4JT`#&`@+RT`"$AM__8O"&$`^RI/V
  1556. M[P`,*T#_^DJ`9P8K0``,8+A*;``T9R@(+0`'__]G(!`M__\"0`#_/P`@;0`(O
  1557. M3I!43R!M``P0$%*M``P;0/__$"W__P)``/\_`"!M``A.D%1/8`#_=DY=3G4`R
  1558. M`!587$]2;'!A3E7_ZDCG(`!P`"!M``@2$`)!`/]![`7MT,$2$#M`__H[0/_XC
  1559. M"`$``F<X,"W_^,'\``H@;0`($A`"00#_4JT`"`)!``_003M`__@@;0`($!`"1
  1560. M0`#_0>P%[=#`$!`(```"9L@@;0`($A`,`0!L9@Q2K0`(.WP``?_Z8`H,`0!H_
  1561. M9@12K0`((&T`#$Z0.T#__B!M``@,$`!C9QQ![`7MT.W__A`0"````V<,(&T`[
  1562. M#$Z0.T#__F#D,BW__@Q!__]F#"!M`!`P@7``8``$:B!M``@0$`)``/]R-EU!'
  1563. M:P`$1+![$`AF]$[[$`0`<V```^P`8V```X8`:&```PP`6&```90`>&```8X`&
  1564. M<&```7P`;V```.X`9&````X`=6````)";?_V8$)P`#M`__9*;?_X9P@,;0`!P
  1565. M__AO+C0M__X,0@`M9P8,0@`K9AX,0@`M9@1R_V`"(@`[0?_V(&T`#$Z04VW_8
  1566. M^#M`__Y![`7M,"W__M#`$A`(`0`"9@P@;0`0,(!P`&```[)"K?_R("W_\G(*$
  1567. M3KH$<C(M__X"00`/2,'0@2M`__(@;0`,3I`[0/_^4VW_^#`M__A*0&<00>P%/
  1568. M[=#M__X0$`@```)FP$JM`!1G``-62FW_]FH$1*W_\DIM__IF$")M`!0@42`M%
  1569. M__(P@&```S8B;0`4(%$@K?_R8``#*#(M__X,00`P;08,00`W;PP@;0`0,(%P@
  1570. M`&```QQ"K?_R("W_\N>`,BW__@)!``=(P="!*T#_\B!M``Q.D#M`__Y3;?_X&
  1571. M,"W_^$I`9Q`R+?_^#$$`,&T&#$$`-V_$2JT`%&<``L1*;?_Z9A`B;0`4(%$@J
  1572. M+?_R,(!@``*N(FT`%"!1(*W_\F```J!*;?_X9@8[?``(__A![`7M,"W__M#`+
  1573. M$A`(`0`'9@P@;0`0,(!P`&```H8[;?_^__P@;0`,3I`[0/_^2FW_^&<(#&T`N
  1574. M`O_X;T0,;0`P__QF/`Q``'AG!@Q``%AF,"!M``Q.D$'L!>TB2-+`$A$[0/_^*
  1575. M"`$`!V8,(FT`$#*`<`!@``(N0JW_\E-M__A@3$'L!>TP+?_\(DC2P!(1"`$`U
  1576. M`F<,(@`$00`P2,$K0?_R(DC2P!(1"`$``&<,(@`$00`W2,$K0?_RT,`2$`@!,
  1577. M``%G"@1``%=(P"M`__)3;?_X,"W_^$I`9VY![`7M,"W__B)(TL`2$0@!``=GJ
  1578. M6B(M__+I@2)(TL`4$2M!__((`@`"9PPB``1!`#!(P8.M__(B2-+`$A$(`0``J
  1579. M9PPB``1!`#=(P8.M__+0P!(0"`$``6<*!$``5TC`@:W_\B!M``Q.D#M`__Y@Y
  1580. MADJM`!1G``%&2FW_^F80(FT`%"!1("W_\C"`8``!,")M`!0@42"M__)@``$B-
  1581. M0>P%[3`M__[0P!(0"`$``F8,(&T`$#"`<`!@``$40FW_]C`M__;!_``*,BW_U
  1582. M_@)!``_003M`__8@;0`,3I`[0/_^4VW_^#`M__A*0&<00>P%[=#M__X0$`@`-
  1583. M``)FQ$JM`!1G``"\(FT`%"!1,*W_]F```*Y*K0`49PXB;0`4(%%2D3`M__X0O
  1584. M@%-M__@P+?_X2D!O(B!M``Q.D#M`__X,0/__9Q)*K0`49]XB;0`4(%%2D1"`O
  1585. M8-(R+?_^#$'__V8*(&T`$#"!<`!@9B!M``A2B"`(8%Q*K0`49PXB;0`4(%%2&
  1586. MD3`M__X0@"!M``Q.D#M`__Y20&<<4VW_^#`M__A*0&<00>P%[=#M__X0$`@`,
  1587. M``-GPB)M`!0@44(08`1P`&`0(&T`$#"M__X@;0`(4H@@"$S?``1.74YU``!*+
  1588. M@&H``!Y$@$J!:@``#$2!80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&-
  1589. M1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].S
  1590. M=2\#=A`,00"`9```!N&944,,00@`9```!NF964,,02``9```!N6954-*06L`R
  1591. M``;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R<
  1592. M`TA#Y[A(0,-`)A\D'TYU($(B0R0`)@%(0DA#Q,'&P,#!U$-(0D)"T((F"20((
  1593. M3G4@;P`((F\`!#`O``QO&+/(91#0P-+`4T`3(%'(__Q@!A+84<C_]"`O``1.*
  1594. M=4Y5__I(YP$@?@!%[`I<OFP'C&P>2E)G%`@J``(``6<"8`HO*@`"3KH"&%A/`
  1595. M4D=<BF#<,"T`"$C`+RT`"B\`3KK!]E!/3-\$@$Y=3G5.5?_\<``B/```,``L`
  1596. M>``$3J[^S@*````P`"M`__Q*@&8$<`!@)$JL`#!G&B!L`#!.D$I`9@1P`&`09
  1597. M0F=P%#\`3KK_<EA/("W__$Y=3G5AL$YU``!.5?_X2.<!`$JL`#!G!$ZZ_YQ"6
  1598. M;``8,"T`$$C`+T``!"(M``@D+0`,)B\`!"QL!Y!.KO_6+@`,A_____]F$BQL&
  1599. M!Y!.KO]\.4``&#E\``4&\"`'3-\`@$Y=3G4``$Y5__A(YP$`2JP`,&<$3KK_Q
  1600. M0$)L`!@P+0`02,`O0``$(BT`""0M``PF+P`$+&P'D$ZN_]`N``R'_____V82J
  1601. M+&P'D$ZN_WPY0``8.7P`!0;P(`=,WP"`3EU.=0``3E7_^$CG,0)*K``P9P1."
  1602. MNO[D0FP`&'``,"T`$%.`+T``$"(M``@D+0`,)B\`$"QL!Y!.KO^^+@`,A___1
  1603. M__]F$BQL!Y!.KO]\.4``&#E\`!8&\#`M`!`,0``"9QH,0``!9PI*0&8B("T`'
  1604. M#&`<(`<@!]"M``Q@$B(M``AT`'8`+&P'D$ZN_[Y.<4S?0(Q.74YU3E7_^$CGG
  1605. M`0!*K``P9P1.NOY40FP`&#`M``Q(P"]```0B+0`()"\`!"QL!Y!.KO_B+@!*(
  1606. MAV86+&P'D$ZN_WPY0``8.7P``@;P</]@`B`'3-\`@$Y=3G4``$Y5``!*K``P!
  1607. M9P1.NOX`(BT`""QL!Y!.KO_<<`!.74YU3E7__$JL`#!G!$ZZ_>!";``8(BT`5
  1608. M"'3^+&P'D$ZN_ZPK0/_\2JW__&<8(BW__"QL!Y!.KO^F(BT`""QL!Y!.KO^XZ
  1609. M(BT`""0\```#[BQL!Y!.KO_B*T#__$JM__QF%BQL!Y!.KO]\.4``&#E\``(&\
  1610. M\'#_8`0@+?_\3EU.=4Y5__Q*K``P9P1.NOUD0FP`&"(M``AT_BQL!Y!.KO^LV
  1611. M*T#__$JM__QG$"(M__PL;`>03J[_IG#_8#8B+0`()#P```/N+&P'D$ZN_^(K-
  1612. M0/_\2JW__&86+&P'D$ZN_WPY0``8.7P``@;P</]@!"`M__Q.74YU3E7_L$CG7
  1613. M``)*K`>49A)#[`@@<``L>``$3J[]V"E`!Y1P`"!L`%00*/__+P`O"$AM_[!.M
  1614. MNOQ03^\`#"!L`%00*/__`D``_T(U`+!![?^P*4@'X$AX`#Q(>`#Z<``O`"\`'
  1615. M2&P(#$AL!_)(;`?4+P!.NM743^\`(%.`9P1P_V`"<`!,WT``3EU.=4S?0(Q.?
  1616. M74YUYJA(0@```^P````#`````0``&)(```$2````#@````````/R```#Z@``8
  1617. M`@T`````````````````````````````````````````````````````````/
  1618. M`````````````````````````````````````````````````````````````
  1619. M`````&1O<RYL:6)R87)Y`'AB=&]A-2`E9"`E<R!"96=I;@H`+0!X8G1O82!"9
  1620. M96=I;@H``'AB=&]A($5N9"!.("5L9"`E;'@@12`E;'@@4R`E;'@@4B`E;'@*]
  1621. M```@("`@("`@("`@("`@($)T;V$@=F5R<VEO;B`E<PH``#4N,@!7<FET=&5NP
  1622. M(&)Y(%!A=6P@4G5T=&5R+"!*;V4@3W)O<W0@)B!3=&5F86X@4&%R;6%R:RX*A
  1623. M```*57-A9V4Z(&)T;V$@6RU[861H;W)]72!;:6YP=70@9FEL95T@6V]U='!U*
  1624. M="!F:6QE70H`"D]P=&EO;G,Z"@``+6@@(%-H;W=S('1H:7,@:&5L<"!L:7-T[
  1625. M+@H``"UA("!5<V4@871O8B!R871H97(@=&AA;B!B=&]A+@H`+6\@(%5S92!O`
  1626. M;&0@=F5R<VEO;B!O9B!B=&]A+@H`+60@($5X=')A8W0@<F5P86ER(&9I;&4@8
  1627. M9G)O;2!D:6%G;F]S:7,@9FEL92X*`"UR("!297!A:7(@87)C:&EV92!F<F]ME
  1628. M(')E<&%I<B!F:6QE+@H`"D5X86UP;&5S.@H`("!B=&]A("UH"@``("!B=&]AS
  1629. M(%MI;G!U="!B:6YA<GD@9FEL95T@6V]U='!U="!A<F-H:79E(&9I;&5="@`@B
  1630. M(&)T;V$@+6\@6VEN<'5T(&)I;F%R>2!F:6QE72!;;W5T<'5T(&%R8VAI=F4@]
  1631. M9FEL95T*```@(&)T;V$@+6$@6VEN<'5T(&%R8VAI=F4@9FEL95T@6V]U='!U=
  1632. M="!B:6YA<GD@9FEL95T*```@(&)T;V$@+60@6W5N9&%M86=E9"!A<F-H:79EZ
  1633. M(&9I;&5="@`@(&)T;V$@+7(@6V1A;6%G960@87)C:&EV92!F:6QE70H`````S
  1634. M`&%R8VAI=F4`>&)T;V$`>&)T;V$@0F5G:6X*``!B=&]A.B!/;&0@8G1O82!F8
  1635. M;W)M870N"@!X8G1O834@)60@)7,@0F5G:6X*`"T`8G1O83H@26QL96=A;"!A&
  1636. M<F-H:79E(&AE861E<BX*``!X8G1O82!%;F0@3B`E;&0@)6QX($4@)6QX(%,@D
  1637. M)6QX(%(@)6QX"@``8G1O83H@0F%D(&9O<FUA="!O;B!L:6YE("5L9"X@0V%N8
  1638. M)W0@<F5P86ER(&9I;&4N"@!B=&]A.B!"860@9FEL92!C:&5C:W-U;2X@0V%N0
  1639. M)W0@<F5P86ER(&9I;&4N"@``87)C:&EV90!B=&]A.B!"860@;&EN92!L96YGM
  1640. M=&@@;VX@;&EN92`E;&0N"@!B=&]A.B!"860@8VAA<F%C=&5R(&]N(&QI;F4@G
  1641. M)6QD+@H`8G1O83H@0F%D(&-H96-K<W5M(&]N(&QI;F4@)6QD+@H``&)T;V$Z9
  1642. M(%-T87)T:6YG(&1I86=N;W-I<RX*``!A<F-H:79E`&)T;V$Z($)A9"!C:&%RL
  1643. M86-T97(@;VX@;&EN92`E;&0N"@``````8G1O82YD:6$`````!*AB=&]A+G)EZ
  1644. M<``````$MF)T;V$N<F1Y``````3$>&1I86=N;W-I<PH````$TGAR97!A:7(*S
  1645. M``````3B8G1O83H@1&EA9VYO<VES(&]U='!U="!T;R`G)7,G+@H``&%R8VAI@
  1646. M=F4`8G1O83H@56YE>'!E8W1E9"!E;F0@;V8@)7,@9FEL92X*`'(`8G1O83H@>
  1647. M0V%N)W0@;W!E;B`G)7,G(&9O<B!I;G!U="X*`'<`8G1O83H@0V%N)W0@;W!E\
  1648. M;B`G)7,G(&9O<B!O=71P=70N"@``9&EA9VYO<VES````!89B=&]A.B!297!AX
  1649. M:7(@;W5T<'5T('1O("<E<R<N"@!R97!A:7(`````!;)B=&]A.B!297!A:7)EO
  1650. M9"!A<F-H:79E('=R:71T96X@=&\@)R5S)RX*```"`````"`@("`@("`@("@H&
  1651. M*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$0
  1652. MA(00$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"Z
  1653. M@H("`@("`@("`@("`@("`@("`@("`A`0$!`@("`@("`@("`@*"@H*"@@("`@T
  1654. M("`@("`@("`@("`@("!($!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0P
  1655. M$!"!@8&!@8$!`0$!`0$!`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("P
  1656. M`@("`@("`@("`@("`@("$!`0$"``````````,#$R,S0U-C<X.6%B8V1E9@``@
  1657. M```-"@``@```````!R@`````````````````````````````!T``````````-
  1658. M`````````````````````````````````````````````````(````!C;VXZZ
  1659. M,3`O,3`O,S(P+S@P+P`J````````````````````````````````````````E
  1660. M*`````````````````````````0````J*B!5<V5R($%B;W)T(%)E<75E<W1E%
  1661. M9"`J*@``__\````.``X````````'I`````#__P````0`!``````````````'J
  1662. MP$-/3E1)3E5%``#__P````0`!`````````?H`````$%"3U)4`/__````!``$8
  1663. M````````"`8`````:6YT=6ET:6]N+FQI8G)A<GD```````/L````#0````$`1
  1664. M``@8```'_@``!^0```?,```'*```!Q````6Z```%D```!.P```3>```$S@``A
  1665. .!,````2R`````````_+,[
  1666. ``
  1667. end
  1668. size 19364
  1669. SHAR_EOF
  1670. cat << \SHAR_EOF > chksum.h
  1671. /* chksum.h */
  1672. /* calcchecksum() was converted to a macro for effectivity reasons. */
  1673. /* Don't (!!) give it an argument that has to be evaluated. This    */
  1674. /* is guaranteed to slow it down.                                   */
  1675.  
  1676. /* Update file checksums. */
  1677.  
  1678. #define calcchecksum(ch)        \
  1679. {                               \
  1680.   extern LONG Ceor, Csum, Crot; \
  1681.                                 \
  1682.   Ceor ^= ch;                   \
  1683.   Csum += ch + 1;               \
  1684.                                 \
  1685.   if (Crot & 0x80000000L)       \
  1686.   {                             \
  1687.     Crot <<= 1;                 \
  1688.     Crot ++;                    \
  1689.   }                             \
  1690.   else                          \
  1691.     Crot <<= 1;                 \
  1692.                                 \
  1693.   Crot += ch;                   \
  1694. }
  1695. SHAR_EOF
  1696. cat << \SHAR_EOF > repair.c
  1697. /* repair.c */
  1698.  
  1699. /* Written by Stefan Parmark. */
  1700.  
  1701. #include <stdio.h>
  1702. #ifdef AMIGA
  1703. #include <stdlib.h>
  1704. #include <string.h>
  1705. #endif AMIGA
  1706.  
  1707. #include "btoa.h"
  1708.  
  1709. /* File names. */
  1710. BYTE *diagnosisname   = "btoa.dia";
  1711. BYTE *repairname      = "btoa.rep";
  1712. BYTE *repairedname    = "btoa.rdy";
  1713.  
  1714. /* File headers. */
  1715. BYTE *diagnosisheader = "xdiagnosis\n";
  1716. BYTE *repairheader    = "xrepair\n";
  1717.  
  1718.  
  1719. /* Produce diagnosis file from diagnoses records created by atob(). */
  1720. /* It contains the lines immediately before and after the error     */
  1721. /* sequence.                                                        */
  1722. void producediagnosis(diagnosislist, infile)
  1723. register struct Diagnosis *diagnosislist;
  1724. register FILE *infile;
  1725. {
  1726.   register FILE *diagnosisfile;
  1727.   LONG startpos, endpos;
  1728.   register LONG currentpos;
  1729.   extern BYTE *diagnosisname, *diagnosisheader, buffer[BUFSIZE];
  1730.  
  1731.   currentpos = ftell(infile);
  1732.  
  1733.   if ((diagnosisfile = fopen_write(diagnosisname)) != NULL)
  1734.   {
  1735.     fprintf(stderr, "btoa: Diagnosis output to '%s'.\n", diagnosisname);
  1736.  
  1737.     fputs(diagnosisheader, diagnosisfile);
  1738.     do
  1739.     {
  1740.       /* Extract startpos & endpos from diagnosislist. */
  1741.       outdiagnosislist(diagnosislist, &startpos, &endpos);
  1742.  
  1743.       if (startpos != -1)
  1744.       {
  1745.         /* Print line before error. */
  1746.         fseek(infile, startpos, 0);
  1747.         fgets(buffer, BUFSIZE, infile);
  1748.         fputs(buffer, diagnosisfile);
  1749.  
  1750.         /* Print line after error. */
  1751.         fseek(infile, endpos, 0);
  1752.         fgets(buffer, BUFSIZE, infile);
  1753.         fputs(buffer, diagnosisfile);
  1754.       }
  1755.     }
  1756.     while (startpos != -1);
  1757.     fputs(diagnosisheader, diagnosisfile);
  1758.  
  1759.     fclose(diagnosisfile);
  1760.   }
  1761.  
  1762.   /* Move file pointer to where it was when we entered. */
  1763.   fseek(infile, currentpos, 0);
  1764. }
  1765.  
  1766.  
  1767. /* Insert two file positions into diagnosislist. */
  1768. void intodiagnosislist(diagnosislist, startpos, endpos)
  1769. register struct Diagnosis *diagnosislist;
  1770. register LONG startpos, endpos;
  1771. {
  1772.   register struct Diagnosis *diagnosisitem, *lastitem;
  1773.  
  1774.   diagnosisitem = (struct Diagnosis *)malloc(sizeof(struct Diagnosis));
  1775.   diagnosisitem->startpos = startpos;
  1776.   diagnosisitem->endpos = endpos;
  1777.   diagnosisitem->next = NULL;
  1778.  
  1779.   if ((lastitem = diagnosislist->last) == NULL)  /* List is empty */
  1780.     diagnosislist->next = diagnosislist->last = diagnosisitem;
  1781.   else
  1782.   {
  1783.     if (lastitem->endpos >= startpos)
  1784.     {
  1785.       lastitem->endpos = endpos;
  1786.       free((BYTE *) diagnosisitem);
  1787.     }
  1788.     else
  1789.     {
  1790.       lastitem->next = diagnosisitem;
  1791.       diagnosislist->last = diagnosisitem;
  1792.     }
  1793.   }
  1794. }
  1795.  
  1796.  
  1797. /* Extract two file positions from diagnosislist. */
  1798. void outdiagnosislist(diagnosislist, startpos, endpos)
  1799. register struct Diagnosis *diagnosislist;
  1800. LONG *startpos, *endpos;
  1801. {
  1802.   register struct Diagnosis *diagnosisitem;
  1803.  
  1804.   if ((diagnosisitem = diagnosislist->next) == NULL)  /* List is empty */
  1805.     *startpos = *endpos = -1;
  1806.   else
  1807.   {
  1808.     *startpos = diagnosisitem->startpos;
  1809.     *endpos = diagnosisitem->endpos;
  1810.  
  1811.     diagnosislist->next = diagnosisitem->next;
  1812.     free((BYTE *)diagnosisitem);
  1813.     if (diagnosislist->next == NULL)
  1814.       diagnosislist->last = NULL;
  1815.   }
  1816. }
  1817.  
  1818.  
  1819. /* Copy infile to outfile until searchstring is found. If outfile */
  1820. /* is NULL nothing will be written.                               */
  1821. BYTE copyfile(infile, outfile, searchstring)
  1822. register FILE *infile, *outfile;
  1823. register BYTE *searchstring;
  1824. {
  1825.   register BYTE stop, error;
  1826.   static BYTE copybuffer[BUFSIZE];
  1827.  
  1828.   stop = error = FALSE;
  1829.   while (!(stop || error))
  1830.     if (readbuffer(copybuffer, "archive", infile))
  1831.       error = TRUE;
  1832.     else
  1833.     {
  1834.       if (outfile != NULL)
  1835.         fputs(copybuffer, outfile);
  1836.       if (strcmp(copybuffer, searchstring) == 0)
  1837.         stop = TRUE;
  1838.     }
  1839.  
  1840.   return(error);
  1841. }
  1842.  
  1843.  
  1844. /* Read a line from infile into buffer. Returns TRUE if */
  1845. /* end-of-file has been reached.                        */
  1846. BYTE readbuffer(buffer, errormsg, infile)
  1847. register BYTE *buffer, *errormsg;
  1848. register FILE *infile;
  1849. {
  1850.   register BYTE error;
  1851.  
  1852.   error = FALSE;
  1853.   if (fgets(buffer, BUFSIZE, infile) == NULL)
  1854.   {
  1855.     fprintf(stderr, "btoa: Unexpected end of %s file.\n", errormsg);
  1856.     error = TRUE;
  1857.   }
  1858.  
  1859.   return(error);
  1860. }
  1861.  
  1862.  
  1863. FILE *fopen_read(filename)
  1864. register BYTE *filename;
  1865. {
  1866.   register FILE *infile;
  1867.  
  1868.   if ((infile = fopen(filename, "r")) == NULL)
  1869.     fprintf(stderr, "btoa: Can't open '%s' for input.\n", filename);
  1870.  
  1871.   return(infile);
  1872. }
  1873.  
  1874.  
  1875. FILE *fopen_write(filename)
  1876. register BYTE *filename;
  1877. {
  1878.   register FILE *outfile;
  1879.  
  1880.   if ((outfile = fopen(filename, "w")) == NULL)
  1881.     fprintf(stderr, "btoa: Can't open '%s' for output.\n", filename);
  1882.  
  1883.   return(outfile);
  1884. }
  1885.  
  1886.  
  1887. /* Extract lines from original archive to fix the damaged one. */
  1888. BYTE producerepair(infile)
  1889. register FILE *infile;
  1890. {
  1891.   register FILE *repairfile, *diagnosisfile;
  1892.   register BYTE error, stop;
  1893.   static BYTE *errormsg = "diagnosis";
  1894.   extern BYTE *diagnosisname, *diagnosisheader, *repairname, *repairheader,
  1895.               buffer[BUFSIZE];
  1896.  
  1897.   error = FALSE;
  1898.   diagnosisfile = repairfile = NULL;
  1899.  
  1900.   fprintf(stderr, "btoa: Repair output to '%s'.\n", repairname);
  1901.   if ((diagnosisfile = fopen_read(diagnosisname)) == NULL)
  1902.     error = TRUE;
  1903.   else if ((repairfile = fopen_write(repairname)) == NULL)
  1904.   {
  1905.     fclose(diagnosisfile);
  1906.     diagnosisfile = NULL;
  1907.     error = TRUE;
  1908.   }
  1909.   else
  1910.   {
  1911.     /* Read until header is found. This makes it possible to   */
  1912.     /* have junk before the header, such as an article header. */
  1913.     do
  1914.     {
  1915.       if (readbuffer(buffer, errormsg, diagnosisfile))
  1916.         error = TRUE;
  1917.     }
  1918.     while (!error && strcmp(buffer, diagnosisheader) != 0);
  1919.     fputs(repairheader, repairfile);
  1920.   }
  1921.  
  1922.   stop = FALSE;
  1923.   while (!(error || stop))
  1924.   {
  1925.     /* Loop until header is found again. */
  1926.  
  1927.     if (readbuffer(buffer, errormsg, diagnosisfile))
  1928.       error = TRUE;
  1929.     else if (strcmp(buffer, diagnosisheader) == 0)
  1930.       stop = TRUE;
  1931.     else
  1932.     {
  1933.       /* Read until line before error is found. */
  1934.       error = copyfile(infile, NULL, buffer);
  1935.       if (!error)
  1936.       {
  1937.         /* Print line before error. */
  1938.         fputs(buffer, repairfile);
  1939.  
  1940.         if (readbuffer(buffer, errormsg, diagnosisfile))
  1941.           error = TRUE;
  1942.         else
  1943.         {
  1944.           /* Print line after error */
  1945.           fputs(buffer, repairfile);
  1946.           /* Copy infile to repairfile until line after error */
  1947.           error = copyfile(infile, repairfile, buffer);
  1948.         }
  1949.       }
  1950.     }
  1951.   }
  1952.  
  1953.   if (!error)
  1954.     fputs(repairheader, repairfile);
  1955.  
  1956.   if (repairfile != NULL)
  1957.     fclose(repairfile);
  1958.   if (diagnosisfile != NULL)
  1959.     fclose(diagnosisfile);
  1960.  
  1961.   return(error);
  1962. }
  1963.  
  1964.  
  1965. /* Repair damaged archive from repair file. */
  1966. BYTE performrepair(infile)
  1967. register FILE *infile;
  1968. {
  1969.   register FILE *repairfile, *outfile;
  1970.   register BYTE error, stop;
  1971.   static BYTE *errormsg = "repair";
  1972.   extern BYTE *repairname, *repairedname, *repairheader, buffer[BUFSIZE];
  1973.  
  1974.   error = FALSE;
  1975.   repairfile = outfile = NULL;
  1976.  
  1977.   if ((repairfile = fopen_read(repairname)) == NULL)
  1978.     error = TRUE;
  1979.   else if ((outfile = fopen_write(repairedname)) == NULL)
  1980.   {
  1981.     fclose(repairfile);
  1982.     repairfile = NULL;
  1983.     error = TRUE;
  1984.   }
  1985.   else
  1986.   {
  1987.     fprintf(stderr, "btoa: Repaired archive written to '%s'.\n", repairedname);
  1988.  
  1989.     /* Read until header is found. */
  1990.     do
  1991.     {
  1992.       if (readbuffer(buffer, errormsg, repairfile))
  1993.         error = TRUE;
  1994.     }
  1995.     while (!error && strcmp(buffer, repairheader) != 0);
  1996.   }
  1997.  
  1998.   stop = FALSE;
  1999.   while (!(error || stop))
  2000.   {
  2001.     /* Loop until header is found. */
  2002.  
  2003.     if (readbuffer(buffer, errormsg, repairfile))
  2004.       error = TRUE;
  2005.     else if (strcmp(buffer, repairheader) == 0)
  2006.       stop = TRUE;
  2007.     else
  2008.     {
  2009.       /* Read and write until line before error. */
  2010.       error = copyfile(infile, outfile, buffer);
  2011.       if (!error)
  2012.         if (readbuffer(buffer, errormsg, repairfile))
  2013.           error = TRUE;
  2014.         else
  2015.         {
  2016.           /* Read and write until line after error. */
  2017.           error = copyfile(repairfile, outfile, buffer);
  2018.           /* Skip until line after error */
  2019.           copyfile(infile, NULL, buffer);
  2020.         }
  2021.     }
  2022.   }
  2023.  
  2024.   if (!error)  /* Write rest of archive. */
  2025.     while (fgets(buffer, BUFSIZE, infile) != NULL)
  2026.       fputs(buffer, outfile);
  2027.  
  2028.   if (outfile != NULL)
  2029.     fclose(outfile);
  2030.   if (repairfile != NULL)
  2031.     fclose(repairfile);
  2032.  
  2033.   return(error);
  2034. }
  2035. SHAR_EOF
  2036. #    End of shell archive
  2037. exit 0
  2038. -- 
  2039. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  2040. Have five nice days.
  2041.